Python实现简单的神经网络_python实现神经网络

    self.bias = bias
    
def feedforward(self, inputs):
    # weight inputs, add bias, then use the activation function
    total = np.dot(self.weights, inputs) + self.bias
    return sigmoid(total)

weights = np.array([0, 1]) # w1 = 0, w2 = 1
bias = 4
n = Neuron(weights, bias)

inputs

x = np.array([2, 3]) # x1 = 2, x2 = 3
print(n.feedforward(x)) # 0.9990889488055994


#### 搭建神经网络


神经网络就是把一堆神经元连接在一起,下面是一个神经网络的简单举例:  
 ![network](https://img-blog.csdnimg.cn/20190327215839188.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2t1bl9jc2Ru,size_16,color_FFFFFF,t_70)  
 这个网络有2个输入、一个包含2个神经元的隐藏层(h1和h2)、包含1个神经元的输出层o1。  
 隐藏层是夹在输入输入层和输出层之间的部分,一个神经网络可以有多个隐藏层。  
 把神经元的输入向前传递获得输出的过程称为**前馈**(feedforward)。  
 我们假设上面的网络里所有神经元都具有相同的权重 
 
 
 
 
 w 
 
 
 = 
 
 
 [ 
 
 
 0 
 
 
 , 
 
 
 1 
 
 
 ] 
 
 
 
 {w=[0,1]} 
 
 
 w=[0,1]和偏置 
 
 
 
 
 b 
 
 
 = 
 
 
 0 
 
 
 
 {b=0} 
 
 
 b=0,激活函数都是 
 
 
 
 
 s 
 
 
 i 
 
 
 g 
 
 
 m 
 
 
 o 
 
 
 i 
 
 
 d 
 
 
 
 {sigmoid} 
 
 
 sigmoid,那么我们会得到什么输出呢?  
  
 
 
 
 
 
 h 
 
 
 1 
 
 
 
 = 
 
 
 
 h 
 
 
 2 
 
 
 
 = 
 
 
 f 
 
 
 ( 
 
 
 w 
 
 
 ∗ 
 
 
 x 
 
 
 + 
 
 
 b 
 
 
 ) 
 
 
 = 
 
 
 f 
 
 
 ( 
 
 
 ( 
 
 
 0 
 
 
 ∗ 
 
 
 2 
 
 
 ) 
 
 
 + 
 
 
 ( 
 
 
 1 
 
 
 ∗ 
 
 
 3 
 
 
 ) 
 
 
 + 
 
 
 0 
 
 
 ) 
 
 
 = 
 
 
 f 
 
 
 ( 
 
 
 3 
 
 
 ) 
 
 
 = 
 
 
 0.9526 
 
 
 
 {h\_1=h\_2=f(w\*x+b)=f((0\*2)+(1\*3)+0)=f(3)=0.9526} 
 
 
 h1​=h2​=f(w∗x+b)=f((0∗2)+(1∗3)+0)=f(3)=0.9526  
  
 
 
 
 
 
 o 
 
 
 1 
 
 
 
 = 
 
 
 f 
 
 
 ( 
 
 
 w 
 
 
 ∗ 
 
 
 [ 
 
 
 
 h 
 
 
 1 
 
 
 
 , 
 
 
 
 h 
 
 
 2 
 
 
 
 ] 
 
 
 + 
 
 
 b 
 
 
 ) 
 
 
 = 
 
 
 f 
 
 
 ( 
 
 
 ( 
 
 
 0 
 
 
 ∗ 
 
 
 
 h 
 
 
 1 
 
 
 
 ) 
 
 
 + 
 
 
 ( 
 
 
 1 
 
 
 ∗ 
 
 
 
 h 
 
 
 2 
 
 
 
 ) 
 
 
 + 
 
 
 0 
 
 
 ) 
 
 
 = 
 
 
 f 
 
 
 ( 
 
 
 0.9526 
 
 
 ) 
 
 
 = 
 
 
 0.7216 
 
 
 
 {o\_1=f(w\*[h\_1,h\_2]+b)=f((0\*h\_1)+(1\*h\_2)+0)=f(0.9526)=0.7216} 
 
 
 o1​=f(w∗[h1​,h2​]+b)=f((0∗h1​)+(1∗h2​)+0)=f(0.9526)=0.7216  
 以下是实现代码:



class OurNeuralNetworks():
“”"
A neural network with:

  • 2 inputs

  • a hidden layer with 2 neurons (h1, h2)

  • an output layer with 1 neuron (o1)
    Each neural has the same weights and bias:

  • w = [0, 1]

  • b = 0
    “”"
    def __init__(self):
    weights = np.array([0, 1])
    bias = 0

     # The Neuron class here is from the previous section
     self.h1 = Neuron(weights, bias)
     self.h2 = Neuron(weights, bias)
     self.o1 = Neuron(weights, bias)
    

    def feedforward(self, x):
    out_h1 = self.h1.feedforward(x)
    out_h2 = self.h2.feedforward(x)

     # The inputs for o1 are the outputs from h1 and h2
     out_o1 = self.o1.feedforward(np.array([out_h1, out_h2]))
     return out_o1
    

network = OurNeuralNetworks()
x = np.array([2, 3])
print(network.feedforward(x)) # 0.7216325609518421


#### 训练神经网络


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




| Name | Weight (lb) | Height (in) | Gender |
| --- | --- | --- | --- |
| Alice | 133 | 65 | F |
| Bob | 160 | 72 | M |
| Charlie | 152 | 70 | M |
| Diana | 120 | 60 | F |


现在我们的目标是训练一个网络,根据体重和身高来推测某人的性别。  
 ![network](https://img-blog.csdnimg.cn/20190327221337166.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2t1bl9jc2Ru,size_16,color_FFFFFF,t_70)  
 为了简便起见,我们将每个人的身高、体重减去一个固定数值,把性别男定义为1、性别女定义为0。




| Name | Weight (减去135) | Height (减去66) | Gender |
| --- | --- | --- | --- |
| Alice | -2 | -1 | 0 |
| Bob | 25 | 6 | 1 |
| Charlie | 17 | 4 | 1 |
| Diana | -15 | -6 | 0 |


在训练神经网络之前,我们需要有一个标准定义它到底好不好,以便我们进行改进,这就是**损失**(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,也就是预测所有人都是男性,那么损失是




| Name |  
 
 
 
 
 
 y 
 
 
 
 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 | 1 | 0 | 1 |
| Bob | 0 | 0 | 0 |
| Charlie | 0 | 0 | 0 |
| Diana | 1 | 0 | 1 |


 
 
 
 
 
 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


##### 计算损失函数的代码如下:



def mse_loss(y_true, y_pred):
# y_true and y_pred are numpy arrays of the same length
return ((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


预测值是由一系列网络权重和偏置计算出来的:  
 ![network2](https://img-blog.csdnimg.cn/20190327223522500.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2t1bl9jc2Ru,size_16,color_FFFFFF,t_70)  
 所以损失函数实际上是包含多个权重、偏置的多元函数:  
  
 
 
 
 
 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​)  
 **(注意!前方高能!需要你有一些基本的多元函数微分知识,比如偏导数、链式求导法则。)**  
 如果调整一下w1,损失函数是会变大还是变小?我们需要知道偏导数∂L/∂w1是正是负才能回答这个问题。  
 根据链式求导法则:  
  
 
 
 
 
 
 
 ∂ 
 
 
 L 
 
 
 
 
 ∂ 
 
 
 
 w 
 
 
 1 
 
 
 
 
 
 = 
 
 
 
 
 ∂ 
 
 
 L 
 
 
 
 
 ∂ 
 
 
 
 y 
 
 
 
 p 
 
 
 r 
 
 
 e 
 
 
 d 
 
 
 
 
 
 
 ∗ 
 
 
 
 
 ∂ 
 
 
 
 y 
 
 
 
 p 
 
 
 r 
 
 
 e 
 
 
 d 
 
 
 
 
 
 
 ∂ 
 
 
 
 w 
 
 
 1 
 
 
 
 
 
 
 {\frac{\partial L}{\partial w\_1}=\frac{\partial L}{\partial y\_{pred}}\*\frac{\partial y\_{pred}}{\partial 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{\partial L}{\partial y\_{pred}}=\frac{\partial (1-y\_{pred})^2}{\partial y\_{pred}}=-2(1-y\_{pred})} 
 
 
 ∂ypred​∂L​=∂ypred​∂(1−ypred​)2​=−2(1−ypred​)  
 接下来我们要想办法获得 
 
 
 
 
 
 y 
 
 
 
 p 
 
 
 r 
 
 
 e 
 
 
 d 
 
 
 
 
 
 {y\_{pred}} 
 
 
 ypred​和w1的关系,我们已经知道神经元h1、h2和o1的数学运算规则:  
  
 
 
 
 
 
 y 
 
 
 
 p 
 
 
 r 
 
 
 e 
 
 
 d 
 
 
 
 
 = 
 
 
 
 o 
 
 
 1 
 
 
 
 = 
 
 
 f 
 
 
 ( 
 
 
 
 w 
 
 
 5 
 
 
 
 
 h 
 
 
 1 
 
 
 
 + 
 
 
 
 w 
 
 
 6 
 
 
 
 
 h 
 
 
 2 
 
 
 
 + 
 
 
 
 b 
 
 
 3 
 
 
 
 ) 
 
 
 
 {y\_{pred}=o\_1=f(w\_5h\_1+w\_6h\_2+b\_3)} 
 
 
 ypred​=o1​=f(w5​h1​+w6​h2​+b3​)  
 实际上只有神经元h1中包含权重w1,所以我们再次运用链式求导法则:  
  
 
 
 
 
 
 
 ∂ 
 
 
 
 y 
 
 
 
 p 
 
 
 r 
 
 
 e 
 
 
 d 
 
 
 
 
 
 
 ∂ 
 
 
 
 w 
 
 
 1 
 
 
 
 
 
 = 
 
 
 
 
 ∂ 
 
 
 
 y 
 
 
 
 p 
 
 
 r 
 
 
 e 
 
 
 d 
 
 
 
 
 
 
 ∂ 
 
 
 
 h 
 
 
 1 
 
 
 
 
 
 ∗ 
 
 
 
 
 ∂ 
 
 
 
 h 
 
 
 1 
 
 
 
 
 
 ∂ 
 
 
 
 w 
 
 
 1 
 
 
 
 
 
 
 {\frac{\partial y\_{pred}}{\partial w\_1}=\frac{\partial y\_{pred}}{\partial h\_1}\*\frac{\partial h\_1}{\partial w\_1}} 
 
 
 ∂w1​∂ypred​​=∂h1​∂ypred​​∗∂w1​∂h1​​


 
 
 
 
 
 
 
 ∂ 
 
 
 
 y 
 
 
 
 p 
 
 
 r 
 
 
 e 
 
 
 d 
 
 
 
 
 
 
 ∂ 
 
 
 
 h 
 
 
 1 
 
 
 
 
 
 = 
 
 
 
 w 
 
 
 5 
 
 
 
 ∗ 
 
 
 
 f 
 
 
 ′ 
 
 
 
 ( 
 
 
 
 w 
 
 
 5 
 
 
 
 
 h 
 
 
 1 
 
 
 
 + 
 
 
 
 w 
 
 
 6 
 
 
 
 
 h 
 
 
 2 
 
 
 
 + 
 
 
 
 h 
 
 
 3 
 
 
 
 ) 
 
 
 
 {\frac{\partial y\_{pred}}{\partial h\_1}=w\_5\*f'(w\_5h\_1+w\_6h\_2+h\_3)} 
 
 
 ∂h1​∂ypred​​=w5​∗f′(w5​h1​+w6​h2​+h3​)  
 然后求 
 
 
 
 
 
 
 ∂ 
 
 
 
 h 
 
 
 1 
 
 
 
 
 
 ∂ 
 
 
 
 w 
 
 
 1 
 
 
 
 
 
 
 {\frac{\partial h\_1}{\partial w\_1}} 
 
 
 ∂w1​∂h1​​:  
  
 
 
 
 
 
 h 
 
 
 1 
 
 
 
 = 
 
 
 f 
 
 
 ( 
 
 
 
 w 
 
 
 1 
 
 
 
 
 x 
 
 
 1 
 
 
 
 + 
 
 
 
 w 
 
 
 2 
 
 
 
 
 x 
 
 
 2 
 
 
 
 + 
 
 
 
 b 
 
 
 1 
 
 
 
 ) 
 
 
 
 {h\_1=f(w\_1x\_1+w\_2x\_2+b\_1)} 
 
 
 h1​=f(w1​x1​+w2​x2​+b1​)  
  
 
 
 
 
 
 
 ∂ 
 
 
 
 h 
 
 
 1 
 
 
 
 
 
 ∂ 
 
 
 
 w 
 
 
 1 
 
 
 
 
 
 = 
 
 
 
 x 
 
 
 1 
 
 
 
 ∗ 
 
 
 
 f 
 
 
 ′ 
 
 
 
 ( 
 
 
 
 w 
 
 
 1 
 
 
 
 
 x 
 
 
 1 
 
 
 
 + 
 
 
 
 w 
 
 
 2 
 
 
 
 
 x 
 
 
 2 
 
 
 
 + 
 
 
 
 h 
 
 
 1 
 
 
 
 ) 
 
 
 
 {\frac{\partial h\_1}{\partial w\_1}=x\_1\*f'(w\_1x\_1+w\_2x\_2+h\_1)} 
 
 
 ∂w1​∂h1​​=x1​∗f′(w1​x1​+w2​x2​+h1​)  
 上面的计算中遇到了2次激活函数 
 
 
 
 
 s 
 
 
 i 
 
 
 g 
 
 
 m 
 
 
 o 
 
 
 i 
 
 
 d 
 
 
 
 {sigmoid} 
 
 
 sigmoid的导数 
 
 
 
 
 
 f 
 
 
 ′ 
 
 
 
 ( 
 
 
 x 
 
 
 ) 
 
 
 
 {f'(x)} 
 
 
 f′(x), 
 
 
 
 
 s 
 
 
 i 
 
 
 g 
 
 
 m 
 
 
 o 
 
 
 i 
 
 
 d 
 
 
 
 {sigmoid} 
 
 
 sigmoid函数的导数很容易求得: 
 
 
 
 
 f 
 
 
 ( 
 
 
 x 
 
 
 ) 
 
 
 = 
 
 
 
 1 
 
 
 
 1 
 
 
 + 
 
 
 
 e 
 
 
 
 − 
 
 
 x 
 
 
 
 
 
 
 
 {f(x)=\frac{1}{1+e^{-x}}} 
 
 
 f(x)=1+e−x1​  
  
 
 
 
 
 
 f 
 
 
 ′ 
 
 
 
 ( 
 
 
 x 
 
 
 ) 
 
 
 = 
 
 
 
 
 e 
 
 
 x 
 
 
 
 
 ( 
 
 
 1 
 
 
 + 
 
 
 
 e 
 
 
 
 − 
 
 
 x 
 
 
 
 
 
 ) 
 
 
 2 
 
 
 
 
 
 = 
 
 
 f 
 
 
 ( 
 
 
 x 
 
 
 ) 
 
 
 ∗ 
 
 
 ( 
 
 
 1 
 
 
 − 
 
 
 f 
 
 
 ( 
 
 
 x 
 
 
 ) 
 
 
 ) 
 
 
 
 {f'(x)=\frac{e^x}{(1+e^{-x})^2}=f(x)\*(1-f(x))} 
 
 
 f′(x)=(1+e−x)2ex​=f(x)∗(1−f(x))


**总的链式求导公式:**  
  
 
 
 
 
 
 
 ∂ 
 
 
 L 
 
 
 
 
 ∂ 
 
 
 
 w 
 
 
 1 
 
 
 
 
 
 = 
 
 
 
 
 ∂ 
 
 
 L 
 
 
 
 
 ∂ 
 
 
 
 y 
 
 
 
 p 
 
 
 r 
 
 
 e 
 
 
 d 
 
 
 
 
 
 
 ∗ 
 
 
 
 
 ∂ 
 
 
 
 y 
 
 
 
 p 
 
 
 r 
 
 
 e 
 
 
 d 
 
 
 
 
 
 
 ∂ 
 
 
 
 h 
 
 
 1 
 
 
 
 
 
 ∗ 
 
 
 
 
 ∂ 
 
 
 
 h 
 
 
 1 
 
 
 
 
 
 ∂ 
 
 
 
 w 
 
 
 1 
 
 
 
 
 
 
 {\frac{\partial L}{\partial w\_1}=\frac{\partial L}{\partial y\_{pred}}\*\frac{\partial y\_{pred}}{\partial h\_1}\*\frac{\partial h\_1}{\partial w\_1}} 
 
 
 ∂w1​∂L​=∂ypred​∂L​∗∂h1​∂ypred​​∗∂w1​∂h1​​  
 这种向后计算偏导数的系统称为**反向传播**(backpropagation)。  
 上面的数学符号太多,下面我们带入实际数值来计算一下。 
 
 
 
 
 
 h 
 
 
 1 
 
 
 
 、 
 
 
 
 h 
 
 
 2 
 
 
 
 和 
 
 
 
 o 
 
 
 1 
 
 
 
 
 {h\_1、h\_2和o\_1} 
 
 
 h1​、h2​和o1​  
  
 
 
 
 
 
 h 
 
 
 1 
 
 
 
 = 
 
 
 f 
 
 
 ( 
 
 
 
 x 
 
 
 1 
 
 
 
 
 w 
 
 
 1 
 
 
 
 + 
 
 
 
 x 
 
 
 2 
 
 
 
 
 w 
 
 
 2 
 
 
 
 + 
 
 
 
 b 
 
 
 1 
 
 
 
 ) 
 
 
 = 
 
 
 0.0474 
 
 
 
 {h\_1=f(x\_1w\_1+x\_2w\_2+b\_1)=0.0474} 
 
 
 h1​=f(x1​w1​+x2​w2​+b1​)=0.0474  
  
 
 
 
 
 
 h 
 
 
 2 
 
 
 
 = 
 
 
 f 
 
 
 ( 
 
 
 
 x 
 
 
 3 
 
 
 
 
 w 
 
 
 3 
 
 
 
 + 
 
 
 
 x 
 
 
 4 
 
 
 
 
 w 
 
 
 4 
 
 
 
 + 
 
 
 
 b 
 
 
 2 
 
 
 
 ) 
 
 
 = 
 
 
 0.0474 
 
 
 
 {h\_2=f(x\_3w\_3+x\_4w\_4+b\_2)=0.0474} 
 
 
 h2​=f(x3​w3​+x4​w4​+b2​)=0.0474  
  
 
 
 
 
 
 o 
 
 
 1 
 
 
 
 = 
 
 
 f 
 
 
 ( 
 
 
 
 h 
 
 
 1 
 
 
 
 
 w 
 
 
 5 
 
 
 
 + 
 
 
 
 h 
 
 
 2 
 
 
 
 
 w 
 
 
 6 
 
 
 
 + 
 
 
 
 b 
 
 
 3 
 
 
 
 ) 
 
 
 = 
 
 
 f 
 
 
 ( 
 
 
 0.0474 
 
 
 + 
 
 
 0.0474 
 
 
 + 
 
 
 0 
 
 
 ) 
 
 
 = 
 
 
 0.524 
 
 
 
 {o\_1=f(h\_1w\_5+h\_2w\_6+b\_3)=f(0.0474+0.0474+0)=0.524} 
 
 
 o1​=f(h1​w5​+h2​w6​+b3​)=f(0.0474+0.0474+0)=0.524  
 神经网络的输出y=0.524,没有显示出强烈的是男(1)是女(0)的证据。现在的预测效果还很不好。  
  
 
 
 
 
 
 
 ∂ 
 
 
 L 
 
 
 
 
 ∂ 
 
 
 
 w 
 
 
 1 
 
 
 
 
 
 = 
 
 
 
 
 ∂ 
 
 
 L 
 
 
 
 
 ∂ 
 
 
 
 y 
 
 
 
 p 
 
 
 r 
 
 
 e 
 
 
 d 
 
 
 
 
 
 
 ∗ 
 
 
 
 
 ∂ 
 
 
 
 y 
 
 
 
 p 
 
 
 r 
 
 
 e 
 
 
 d 
 
 
 
 
 
 
 ∂ 
 
 
 
 h 
 
 
 1 
 
 
 
 
 
 ∗ 
 
 
 
 
 ∂ 
 
 
 
 h 
 
 
 1 
 
 
 
 
 
 ∂ 
 
 
 
 w 
 
 
 1 
 
 
 
 
 
 
 {\frac{\partial L}{\partial w\_1}=\frac{\partial L}{\partial y\_{pred}}\*\frac{\partial y\_{pred}}{\partial h\_1}\*\frac{\partial h\_1}{\partial w\_1}} 
 
 
 ∂w1​∂L​=∂ypred​∂L​∗∂h1​∂ypred​​∗∂w1​∂h1​​


* ∂ 
 
 
 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 
 
 
 
 
 ) 
 
 
 = 
 
 
 − 
 
 
 2 
 
 
 ( 
 
 
 1 
 
 
 − 
 
 
 0.524 
 
 
 ) 
 
 
 = 
 
 
 − 
 
 
 0.952 
 
 
 
 {\frac{\partial L}{\partial y\_{pred}}=\frac{\partial (1-y\_{pred})^2}{\partial y\_{pred}}=-2(1-y\_{pred})=-2(1-0.524)=-0.952} 
 
 
 ∂ypred​∂L​=∂ypred​∂(1−ypred​)2​=−2(1−ypred​)=−2(1−0.524)=−0.952
* ∂ 
 
 
 
 y 
 
 
 
 p 
 
 
 r 
 
 
 e 
 
 
 d 
 
 
 
 
 
 
 ∂ 
 
 
 
 h 
 
 
 1 
 
 
 
 
 
 = 
 
 
 
 w 
 
 
 5 
 
 
 
 ∗ 
 
 
 
 f 
 
 
 ′ 
 
 
 
 ( 
 
 
 
 w 
 
 
 5 
 
 
 
 
 h 
 
 
 1 
 
 
 
 + 
 
 
 
 w 
 
 
 6 
 
 
 
 
 h 
 
 
 2 
 
 
 
 + 
 
 
 
 h 
 
 
 3 
 
 
 
 ) 
 
 
 = 
 
 
 1 
 
 
 ∗ 
 
 
 
 f 
 
 
 ′ 
 
 
 
 ( 
 
 
 0.0474 
 
 
 + 
 
 
 0.0474 
 
 
 + 
 
 
 0 
 
 
 ) 
 
 
 = 
 
 
 f 
 
 
 ( 
 
 
 0.0948 
 
 
 ) 
 
 
 ∗ 
 
 
 ( 
 
 
 1 
 
 
 − 
 
 
 f 
 
 
 ( 
 
 
 0.0948 
 
 
 ) 
 
 
 ) 
 
 
 = 
 
 
 0.249 
 
 
 
 {\frac{\partial y\_{pred}}{\partial h\_1}=w\_5\*f'(w\_5h\_1+w\_6h\_2+h\_3)=1\*f'(0.0474+0.0474+0)=f(0.0948)\*(1-f(0.0948))=0.249} 
 
 
 ∂h1​∂ypred​​=w5​∗f′(w5​h1​+w6​h2​+h3​)=1∗f′(0.0474+0.0474+0)=f(0.0948)∗(1−f(0.0948))=0.249
* ∂ 
 
 
 
 h 
 
 
 1 
 
 
 
 
 
 ∂ 
 
 
 
 w 
 
 
 1 
 
 
 
 
 
 = 
 
 
 
 x 
 
 
 1 
 
 
 
 ∗ 
 
 
 
 f 
 
 
 ′ 
 
 
 
 ( 
 
 
 
 w 
 
 
 1 
 
 
 
 
 x 
 
 
 1 
 
 
 
 + 
 
 
 
 w 
 
 
 2 
 
 
 
 
 x 
 
 
 2 
 
 
 
 + 
 
 
 
 h 
 
 
 1 
 
 
 
 ) 
 
 
 = 
 
 
 − 
 
 
 2 
 
 
 ∗ 
 
 
 
 f 
 
 
 ′ 
 
 
 
 ( 
 
 
 − 
 
 
 2 
 
 
 + 
 
 
 − 
 
 
 1 
 
 
 + 
 
 
 0 
 
 
 ) 
 
 
 = 
 
 
 − 
 
 
 2 
 
 
 ∗ 
 
 
 f 
 
 
 ( 
 
 
 − 
 
 
 3 
 
 
 ) 
 
 
 ∗ 
 
 
 ( 
 
 
 1 
 
 
 − 
 
 
 f 
 
 
 ( 
 
 
 − 
 
 
 3 
 
 
 ) 
 
 
 ) 
 
 
 = 
 
 
 − 
 
 
 0.0904 
 
 
 
 {\frac{\partial h\_1}{\partial w\_1}=x\_1\*f'(w\_1x\_1+w\_2x\_2+h\_1)=-2\*f'(-2+-1+0)=-2\*f(-3)\*(1-f(-3))=-0.0904} 
 
 
 ∂w1​∂h1​​=x1​∗f′(w1​x1​+w2​x2​+h1​)=−2∗f′(−2+−1+0)=−2∗f(−3)∗(1−f(−3))=−0.0904


所以 
 
 
 
 
 
 
 ∂ 
 
 
 L 
 
 
 
 
 ∂ 
 
 
 
 w 
 
 
 1 
 
 
 
 
 
 = 
 
 
 − 
 
 
 0.952 
 
 
 ∗ 
 
 
 0.249 
 
 
 ∗ 
 
 
 − 
 
 
 0.0904 
 
 
 = 
 
 
 0.0214 
 
 
 
 {\frac{\partial L}{\partial w\_1}=-0.952\*0.249\*-0.0904 = 0.0214} 
 
 
 ∂w1​∂L​=−0.952∗0.249∗−0.0904=0.0214


这个结果告诉我们:如果增大w1,损失函数L会有一个非常小的增长。


##### 随机梯度下降


下面将使用一种称为**随机梯度下降**(**SGD**)的优化算法,来训练网络。  
 经过前面的运算,我们已经有了训练神经网络所有数据。但是该如何操作?SGD定义了**改变权重和偏置**的方法:  
  
 
 
 
 
 
 w 
 
 
 1 
 
 
 
 ← 
 
 
 
 w 
 
 
 1 
 
 
 
 − 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值