【CSDN软件工程师能力认证学习精选】Python实现简单的神经网络( 二 )


训练神经网络
现在我们已经学会了如何搭建神经网络,现在再来学习如何训练它,其实这是一个优化的过程 。
假设有一个数据集,包含4个人的身高、体重和性别:
(lb) (in)
Alice
133
65
Bob
160
72

【CSDN软件工程师能力认证学习精选】Python实现简单的神经网络

文章插图
152
70
Diana
120
60
现在我们的目标是训练一个网络,根据体重和身高来推测某人的性别 。
为了简便起见,我们将每个人的身高、体重减去一个固定数值,把性别男定义为1、性别女定义为0 。
(减去135) (减去66)
Alice
-2
-1
Bob
25
17
Diana
-15
-6
在训练神经网络之前,我们需要有一个标准定义它到底好不好,以便我们进行改进,这就是损失(loss) 。
比如用均方误差(MSE)来定义损失:
M S E = 1 n ∑ i = 1 n ( y t r u e ? y p r e d ) 2 {MSE=\frac{1}{n}\sum_{i=1}^{n}(y_{true}-y_{pred})^2}MSE=n1?∑i=1n?(ytrue??ypred?)2
n {n}n是样本的数量,在上面的数据集中是4;
y {y}y代表人的性别,男性是1,女性是0;
y t r u e {y_{true}}ytrue?是变量的真实值,y p r e d {y_{pred}}ypred?是变量的预测值 。
顾名思义,均方误差就是所有数据方差的平均值,我们不妨就把它定义为损失函数 。预测结果越好,损失就越低,训练神经网络就是将损失最小化 。
如果上面网络的输出一直是0,也就是预测所有人都是男性,那么损失是
Namey t r u e {y_{true}}ytrue?y p r e d {y_{pred}}ypred?( y t r u e ? y p r e d ) 2 {(y_{true}-y_{pred})^2}(ytrue??ypred?)2
Alice
Bob
Diana
M S E = 1 4 ( 1 + 0 + 0 + 1 ) = 0.5 {MSE=\frac{1}{4}(1+0+0+1)=0.5}MSE=41?(1+0+0+1)=0.5
【【CSDN软件工程师能力认证学习精选】Python实现简单的神经网络】计算损失函数的代码如下:
def mse_loss(y_true, y_pred):# y_true and y_pred are numpy arrays of the same lengthreturn ((y_true - y_pred) ** 2).mean()y_true = np.array([1, 0, 0, 1])y_pred = np.array([0, 0, 0, 0])print(mse_loss(y_true, y_pred)) # 0.5
减少神经网络损失
这个神经网络不够好,还要不断优化,尽量减少损失 。我们知道,改变网络的权重和偏置可以影响预测值,但我们应该怎么做呢?
为了简单起见,我们把数据集缩减到只包含Alice一个人的数据 。于是损失函数就剩下Alice一个人的方差:
M S E = 1 1 ∑ i = 1 1 ( y t r u e ? y p r e d ) 2 = ( y t r u e ? y p r e d ) 2 = ( 1 ? y p r e d ) 2 {MSE=\frac{1}{1}\sum_{i=1}^{1}(y_{true}-y_{pred})^2=(y_{true}-y_{pred})^2=(1-y_{pred})^2}MSE=11?∑i=11?(ytrue??ypred?)2=(ytrue??ypred?)2=(1?ypred?)2
预测值是由一系列网络权重和偏置计算出来的:
所以损失函数实际上是包含多个权重、偏置的多元函数:
L ( w 1 , w 2 , w 3 , w 4 , w 5 , w 6 , b 1 , b 2 , b 3 ) {L(w_1,w_2,w_3,w_4,w_5,w_6,b_1,b_2,b_3)}L(w1?,w2?,w3?,w4?,w5?,w6?,b1?,b2?,b3?)
【CSDN软件工程师能力认证学习精选】Python实现简单的神经网络

文章插图
(注意!前方高能!需要你有一些基本的多元函数微分知识,比如偏导数、链式求导法则 。)
如果调整一下w1,损失函数是会变大还是变小?我们需要知道偏导数?L/?w1是正是负才能回答这个问题 。
根据链式求导法则:
? L ? w 1 = ? L ? y p r e d ? ? y p r e d ? w 1 {\frac{\ L}{\ w_1}=\frac{\ L}{\ y_{pred}}*\frac{\ y_{pred}}{\ w_1}}?w1??L?=?ypred??L???w1??ypred??
可以求得第一项偏导数:
? L ? y p r e d = ? ( 1 ? y p r e d ) 2 ? y p r e d = ? 2 ( 1 ? y p r e d ) {\frac{\ L}{\ y_{pred}}=\frac{\ (1-y_{pred})^2}{\ y_{pred}}=-2(1-y_{pred})}?ypred??L?=?ypred??(1?ypred?)2?=?2(1?ypred?)