1、 神经元细胞的数学模型
神经网络由基本的神经元组成,图1-13就是一个神经元的数学/计算模型,便于我们用程序来实现。
输入 input
( x 1 , x 2 , x 3 ) (x_1,x_2,x_3) (x1,x2,x3) 是外界输入信号,一般是一个训练数据样本的多个属性,比如,我们要预测一套房子的价格,那么在房屋价格数据样本中, x 1 x_1 x1 可能代表了面积, x 2 x_2 x2 可能代表地理位置, x 3 x_3 x3 可能代表朝向。另外一个例子是, ( x 1 , x 2 , x 3 ) (x_1,x_2,x_3) (x1,x2,x3) 分别代表了(红,绿,蓝)三种颜色,而此神经元用于识别输入的信号是暖色还是冷色。
权重 weights
( w 1 , w 2 , w 3 ) (w_1,w_2,w_3) (w1,w2,w3) 是每个输入信号的权重值,以上面的 ( x 1 , x 2 , x 3 ) (x_1,x_2,x_3) (x1,x2,x3) 的例子来说, x 1 x_1 x1 的权重可能是 0.92 0.92 0.92, x 2 x_2 x2 的权重可能是 0.2 0.2 0.2, x 3 x_3 x3 的权重可能是 0.03 0.03 0.03。当然权重值相加之后可以不是 1 1 1。
偏移 bias
还有个 b b b 是怎么来的?一般的书或者博客上会告诉你那是因为 y = w x + b y=wx+b y=wx+b, b b b 是偏移值,使得直线能够沿 Y Y Y 轴上下移动。这是用结果来解释原因,并非 b b b 存在的真实原因。从生物学上解释,在脑神经细胞中,一定是输入信号的电平/电流大于某个临界值时,神经元细胞才会处于兴奋状态,这个 b b b 实际就是那个临界值。亦即当:
w 1 ⋅ x 1 + w 2 ⋅ x 2 + w 3 ⋅ x 3 ≥ t w_1 \cdot x_1 + w_2 \cdot x_2 + w_3 \cdot x_3 \geq t w1⋅x1+w2⋅x2+w3⋅x3≥t
时,该神经元细胞才会兴奋。我们把t挪到等式左侧来,变成 ( − t ) (-t) (−t),然后把它写成 b b b,变成了:
w 1 ⋅ x 1 + w 2 ⋅ x 2 + w 3 ⋅ x 3 + b ≥ 0 w_1 \cdot x_1 + w_2 \cdot x_2 + w_3 \cdot x_3 + b \geq 0 w1⋅x1+w2⋅x2+w3⋅x3+b≥0
于是 b b b 诞生了!
求和计算 sum
Z = w 1 ⋅ x 1 + w 2 ⋅ x 2 + w 3 ⋅ x 3 + b = ∑ i = 1 m ( w i ⋅ x i ) + b \begin{aligned} Z &= w_1 \cdot x_1 + w_2 \cdot x_2 + w_3 \cdot x_3 + b \\\\ &= \sum_{i=1}^m(w_i \cdot x_i) + b \end{aligned} Z=w1⋅x1+w2⋅x2+w3⋅x3+b=i=1∑m(wi⋅xi)+b
在上面的例子中 m = 3 m=3 m=3。我们把 w i ⋅ x i w_i \cdot x_i wi⋅xi变成矩阵运算的话,就变成了:
Z = W ⋅ X + b Z = W \cdot X + b Z=W⋅X+b
激活函数 activation
求和之后,神经细胞已经处于兴奋状态了,已经决定要向下一个神经元传递信号了,但是要传递多强烈的信号,要由激活函数来确定:
A = σ ( Z ) A=\sigma{(Z)} A=σ(Z)
如果激活函数是一个阶跃信号的话,会像继电器开合一样咔咔的开启和闭合,在生物体中是不可能有这种装置的,而是一个渐渐变化的过程。所以一般激活函数都是有一个渐变的过程,也就是说是个曲线。
小结
- 一个神经元可以有多个输入。
- 一个神经元只能有一个输出,这个输出可以同时输入给多个神经元。
- 一个神经元的 w w w 的数量和输入的数量一致。
- 一个神经元只有一个 b b b。
- w w w 和 b b b 有人为的初始值,在训练过程中被不断修改。
- A A A 可以等于 Z Z Z,即激活函数不是必须有的。
- 一层神经网络中的所有神经元的激活函数必须一致。
2、 神经网络中的三个基本概念
这三大概念是:反向传播,梯度下降,损失函数。
简单总结一下反向传播与梯度下降的基本工作原理:
- 初始化;
- 正向计算;
- 损失函数为我们提供了计算损失的方法;
- 梯度下降是在损失函数基础上向着损失最小的点靠近而指引了网络权重调整的方向;
- 反向传播把损失值反向传给神经网络的每一层,让每一层都根据损失值反向调整权重;
- Go to 2,直到精度足够好(比如损失函数值小于 0.001 0.001 0.001)。
3、 线性反向传播
3.1 正向计算的实例
假设有一个函数:
z = x ⋅ y (1) z = x \cdot y \tag{1} z=x⋅y(1)
其中:
x = 2 w + 3 b (2) x = 2w + 3b \tag{2} x=2w+3b(2)
y = 2 b + 1 (3) y = 2b + 1 \tag{3} y=2b+1(3)
计算图如图2-4。
注意这里 x , y , z x,y,z x,y,z 不是变量,只是中间计算结果; w , b w,b w,b 才是变量。因为在后面要学习的神经网络中,要最终求解的目标是 w w w 和 b b b 的值,所以在这里先预热一下。
当
w
=
3
,
b
=
4
w = 3, b = 4
w=3,b=4 时,会得到图2-5的结果。
最终的 z z z 值,受到了前面很多因素的影响:变量 w w w,变量 b b b,计算式 x x x,计算式 y y y。
3.2 反向传播求解 w w w
求 w w w 的偏导
目前 z = 162 z=162 z=162,如果想让 z z z 变小一些,比如目标是 z = 150 z=150 z=150, w w w 应该如何变化呢?为了简化问题,先只考虑改变 w w w 的值,而令 b b b 值固定为 4 4 4。
如果想解决这个问题,最笨的办法是可以在输入端一点一点的试,把 w w w 变成 3.5 3.5 3.5 试试,再变成 3 3 3 试试…直到满意为止。现在我们将要学习一个更好的解决办法:反向传播。
从 z z z 开始一层一层向回看,图中各节点关于变量 w w w 的偏导计算结果如下:
因为 z = x ⋅ y z = x \cdot y z=x⋅y,其中 x = 2 w + 3 b , y = 2 b + 1 x = 2w + 3b, y = 2b + 1 x=2w+3b,y=2b+1
所以:
∂ z ∂ w = ∂ z ∂ x ⋅ ∂ x ∂ w = y ⋅ 2 = 18 (4) \frac{\partial{z}}{\partial{w}}=\frac{\partial{z}}{\partial{x}} \cdot \frac{\partial{x}}{\partial{w}}=y \cdot 2=18 \tag{4} ∂w∂z=∂x∂z⋅∂w∂x=y⋅2=18(4)
其中:
∂ z ∂ x = ∂ ∂ x ( x ⋅ y ) = y = 9 \frac{\partial{z}}{\partial{x}}=\frac{\partial{}}{\partial{x}}(x \cdot y)=y=9 ∂x∂z=∂x∂(x⋅y)=y=9
∂
x
∂
w
=
∂
∂
w
(
2
w
+
3
b
)
=
2
\frac{\partial{x}}{\partial{w}}=\frac{\partial{}}{\partial{w}}(2w+3b)=2
∂w∂x=∂w∂(2w+3b)=2
图2-6 对 w w w 的偏导求解过程
图2-6其实就是链式法则的具体表现, z z z 的误差通过中间的 x x x 传递到 w w w。如果不是用链式法则,而是直接用 z z z 的表达式计算对 w w w 的偏导数,会怎么样呢?我们来试验一下。
根据公式1、2、3,我们有:
z = x ⋅ y = ( 2 w + 3 b ) ( 2 b + 1 ) = 4 w b + 2 w + 6 b 2 + 3 b (5) z=x \cdot y=(2w+3b)(2b+1)=4wb+2w+6b^2+3b \tag{5} z=x⋅y=(2w+3b)(2b+1)=4wb+2w+6b2+3b(5)
对上式求 w w w 的偏导:
∂ z ∂ w = 4 b + 2 = 4 ⋅ 4 + 2 = 18 (6) \frac{\partial z}{\partial w}=4b+2=4 \cdot 4 + 2=18 \tag{6} ∂w∂z=4b+2=4⋅4+2=18(6)
公式4和公式6的结果完全一致!所以,请大家相信链式法则的科学性。
求 w w w 的具体变化值
公式4和公式6的含义是:当 w w w 变化一点点时, z z z 会产生 w w w 的变化值18倍的变化。记住我们的目标是让 z = 150 z=150 z=150,目前在初始状态时是 z = 162 z=162 z=162,所以,问题转化为:当需要 z z z 从 162 162 162 变到 150 150 150 时, w w w 需要变化多少?
既然:
Δ z = 18 ⋅ Δ w \Delta z = 18 \cdot \Delta w Δz=18⋅Δw
则:
Δ w = Δ z 18 = 162 − 150 18 = 0.6667 \Delta w = {\Delta z \over 18}=\frac{162-150}{18}= 0.6667 Δw=18Δz=18162−150=0.6667
所以:
w
=
w
−
0.6667
=
2.3333
w = w - 0.6667=2.3333
w=w−0.6667=2.3333
x
=
2
w
+
3
b
=
16.6667
x=2w+3b=16.6667
x=2w+3b=16.6667
z
=
x
⋅
y
=
16.6667
×
9
=
150.0003
z=x \cdot y=16.6667 \times 9=150.0003
z=x⋅y=16.6667×9=150.0003
我们一下子就成功地让 z z z 值变成了 150.0003 150.0003 150.0003,与 150 150 150 的目标非常地接近,这就是偏导数的威力所在。
3.3反向传播求解 b b b
求 b b b 的偏导
这次我们令 w w w 的值固定为 3 3 3,变化 b b b 的值,目标还是让 z = 150 z=150 z=150。同上一小节一样,先求 b b b 的偏导数。
注意,在上一小节中,求 w w w 的导数只经过了一条路:从 z z z 到 x x x 到 w w w。但是求 b b b 的导数时要经过两条路,如图2-7所示:
- 从 z z z 到 x x x 到 b b b;
- 从 z z z 到 y y y 到 b b b。
从复合导数公式来看,这两者应该是相加的关系,所以有:
∂ z ∂ b = ∂ z ∂ x ⋅ ∂ x ∂ b + ∂ z ∂ y ⋅ ∂ y ∂ b = y ⋅ 3 + x ⋅ 2 = 63 (7) \frac{\partial{z}}{\partial{b}}=\frac{\partial{z}}{\partial{x}} \cdot \frac{\partial{x}}{\partial{b}}+\frac{\partial{z}}{\partial{y}}\cdot\frac{\partial{y}}{\partial{b}}=y \cdot 3+x \cdot 2=63 \tag{7} ∂b∂z=∂x∂z⋅∂b∂x+∂y∂z⋅∂b∂y=y⋅3+x⋅2=63(7)
其中:
∂
z
∂
x
=
∂
∂
x
(
x
⋅
y
)
=
y
=
9
\frac{\partial{z}}{\partial{x}}=\frac{\partial{}}{\partial{x}}(x \cdot y)=y=9
∂x∂z=∂x∂(x⋅y)=y=9
∂
z
∂
y
=
∂
∂
y
(
x
⋅
y
)
=
x
=
18
\frac{\partial{z}}{\partial{y}}=\frac{\partial{}}{\partial{y}}(x \cdot y)=x=18
∂y∂z=∂y∂(x⋅y)=x=18
∂
x
∂
b
=
∂
∂
b
(
2
w
+
3
b
)
=
3
\frac{\partial{x}}{\partial{b}}=\frac{\partial{}}{\partial{b}}(2w+3b)=3
∂b∂x=∂b∂(2w+3b)=3
∂
y
∂
b
=
∂
∂
b
(
2
b
+
1
)
=
2
\frac{\partial{y}}{\partial{b}}=\frac{\partial{}}{\partial{b}}(2b+1)=2
∂b∂y=∂b∂(2b+1)=2
我们不妨再验证一下链式求导的正确性。把公式5再拿过来:
z = x ⋅ y = ( 2 w + 3 b ) ( 2 b + 1 ) = 4 w b + 2 w + 6 b 2 + 3 b (5) z=x \cdot y=(2w+3b)(2b+1)=4wb+2w+6b^2+3b \tag{5} z=x⋅y=(2w+3b)(2b+1)=4wb+2w+6b2+3b(5)
对上式求b的偏导:
∂ z ∂ b = 4 w + 12 b + 3 = 12 + 48 + 3 = 63 (8) \frac{\partial z}{\partial b}=4w+12b+3=12+48+3=63 \tag{8} ∂b∂z=4w+12b+3=12+48+3=63(8)
结果和公式7的链式法则一样。
求 b b b 的具体变化值
公式7和公式8的含义是:当 b b b 变化一点点时, z z z 会发生 b b b 的变化值 63 63 63 倍的变化。记住我们的目标是让 z = 150 z=150 z=150,目前在初始状态时是 162 162 162,所以,问题转化为:当我们需要 z z z 从 162 162 162 变到 150 150 150 时, b b b 需要变化多少?
既然:
Δ z = 63 ⋅ Δ b \Delta z = 63 \cdot \Delta b Δz=63⋅Δb
则:
Δ b = Δ z 63 = 162 − 150 63 = 0.1905 \Delta b = \frac{\Delta z}{63}=\frac{162-150}{63}=0.1905 Δb=63Δz=63162−150=0.1905
所以:
b
=
b
−
0.1905
=
3.8095
b=b-0.1905=3.8095
b=b−0.1905=3.8095
x
=
2
w
+
3
b
=
17.4285
x=2w+3b=17.4285
x=2w+3b=17.4285
y
=
2
b
+
1
=
8.619
y=2b+1=8.619
y=2b+1=8.619
z
=
x
⋅
y
=
17.4285
×
8.619
=
150.2162
z=x \cdot y=17.4285 \times 8.619=150.2162
z=x⋅y=17.4285×8.619=150.2162
这个结果也是与
150
150
150 很接近了,但是精度还不够。再迭代几次,直到误差不大于 1e-4
时,我们就可以结束迭代了,对于计算机来说,这些运算的执行速度很快。
【课题练习】请自己尝试手动继续迭代两次,看看误差的精度可以达到多少?
这个问题用数学公式倒推求解一个二次方程,就能直接得到准确的b值吗?是的!但是我们是要说明机器学习的方法,机器并不会解二次方程,而且很多时候不是用二次方程就能解决实际问题的。而上例所示,是用机器所擅长的迭代计算的方法来不断逼近真实解,这就是机器学习的真谛!而且这种方法是普遍适用的。
3.4 同时求解 w w w 和 b b b 的变化值
这次我们要同时改变 w w w 和 b b b,到达最终结果为 z = 150 z=150 z=150 的目的。
已知 Δ z = 12 \Delta z=12 Δz=12,我们不妨把这个误差的一半算在 w w w 的账上,另外一半算在 b b b 的账上:
Δ b = Δ z / 2 63 = 12 / 2 63 = 0.095 \Delta b=\frac{\Delta z / 2}{63} = \frac{12/2}{63}=0.095 Δb=63Δz/2=6312/2=0.095
Δ w = Δ z / 2 18 = 12 / 2 18 = 0.333 \Delta w=\frac{\Delta z / 2}{18} = \frac{12/2}{18}=0.333 Δw=18Δz/2=1812/2=0.333
- w = w − Δ w = 3 − 0.333 = 2.667 w = w-\Delta w=3-0.333=2.667 w=w−Δw=3−0.333=2.667
- b = b − Δ b = 4 − 0.095 = 3.905 b = b - \Delta b=4-0.095=3.905 b=b−Δb=4−0.095=3.905
- x = 2 w + 3 b = 2 × 2.667 + 3 × 3.905 = 17.049 x=2w+3b=2 \times 2.667+3 \times 3.905=17.049 x=2w+3b=2×2.667+3×3.905=17.049
- y = 2 b + 1 = 2 × 3.905 + 1 = 8.81 y=2b+1=2 \times 3.905+1=8.81 y=2b+1=2×3.905+1=8.81
- z = x × y = 17.049 × 8.81 = 150.2 z=x \times y=17.049 \times 8.81=150.2 z=x×y=17.049×8.81=150.2
容易出现的问题:
- 在检查 Δ z \Delta z Δz 时的值时,注意要用绝对值,因为有可能是个负数
- 在计算 Δ b \Delta b Δb 和 Δ w \Delta w Δw 时,第一次时,它们对 z z z 的贡献值分别是 1 / 63 1/63 1/63 和 1 / 18 1/18 1/18,但是第二次时,由于 b , w b,w b,w 值的变化,对 z z z 的贡献值也会有微小变化,所以要重新计算。具体解释如下:
∂
z
∂
b
=
∂
z
∂
x
⋅
∂
x
∂
b
+
∂
z
∂
y
⋅
∂
y
∂
b
=
y
⋅
3
+
x
⋅
2
=
3
y
+
2
x
\frac{\partial{z}}{\partial{b}}=\frac{\partial{z}}{\partial{x}} \cdot \frac{\partial{x}}{\partial{b}}+\frac{\partial{z}}{\partial{y}}\cdot\frac{\partial{y}}{\partial{b}}=y \cdot 3+x \cdot 2=3y+2x
∂b∂z=∂x∂z⋅∂b∂x+∂y∂z⋅∂b∂y=y⋅3+x⋅2=3y+2x
∂
z
∂
w
=
∂
z
∂
x
⋅
∂
x
∂
w
+
∂
z
∂
y
⋅
∂
y
∂
w
=
y
⋅
2
+
x
⋅
0
=
2
y
\frac{\partial{z}}{\partial{w}}=\frac{\partial{z}}{\partial{x}} \cdot \frac{\partial{x}}{\partial{w}}+\frac{\partial{z}}{\partial{y}}\cdot\frac{\partial{y}}{\partial{w}}=y \cdot 2+x \cdot 0 = 2y
∂w∂z=∂x∂z⋅∂w∂x+∂y∂z⋅∂w∂y=y⋅2+x⋅0=2y
所以,在每次迭代中,要重新计算下面两个值:
Δ
b
=
Δ
z
3
y
+
2
x
\Delta b=\frac{\Delta z}{3y+2x}
Δb=3y+2xΔz
Δ
w
=
Δ
z
2
y
\Delta w=\frac{\Delta z}{2y}
Δw=2yΔz
4、 梯度下降
4.1 从自然现象中理解梯度下降
在大多数文章中,都以“一个人被困在山上,需要迅速下到谷底”来举例,这个人会“寻找当前所处位置最陡峭的地方向下走”。这个例子中忽略了安全因素,这个人不可能沿着最陡峭的方向走,要考虑坡度。
在自然界中,梯度下降的最好例子,就是泉水下山的过程:
- 水受重力影响,会在当前位置,沿着最陡峭的方向流动,有时会形成瀑布(梯度下降);
- 水流下山的路径不是唯一的,在同一个地点,有可能有多个位置具有同样的陡峭程度,而造成了分流(可以得到多个解);
- 遇到坑洼地区,有可能形成湖泊,而终止下山过程(不能得到全局最优解,而是局部最优解)。
4.2 梯度下降的数学理解
梯度下降的数学公式:
θ n + 1 = θ n − η ⋅ ∇ J ( θ ) (1) \theta_{n+1} = \theta_{n} - \eta \cdot \nabla J(\theta) \tag{1} θn+1=θn−η⋅∇J(θ)(1)
其中:
- θ n + 1 \theta_{n+1} θn+1:下一个值;
- θ n \theta_n θn:当前值;
- − - −:减号,梯度的反向;
- η \eta η:学习率或步长,控制每一步走的距离,不要太快以免错过了最佳景点,不要太慢以免时间太长;
- ∇ \nabla ∇:梯度,函数当前位置的最快上升点;
- J ( θ ) J(\theta) J(θ):函数。
梯度下降的三要素
- 当前点;
- 方向;
- 步长。
为什么说是“梯度下降”?
“梯度下降”包含了两层含义:
- 梯度:函数当前位置的最快上升点;
- 下降:与导数相反的方向,用数学语言描述就是那个减号。
5 损失函数概论
5.1 概念
在各种材料中经常看到的中英文词汇有:误差,偏差,Error,Cost,Loss,损失,代价…意思都差不多,在本书中,使用“损失函数”和“Loss Function”这两个词汇,具体的损失函数符号用 J J J 来表示,误差值用 l o s s loss loss 表示。
“损失”就是所有样本的“误差”的总和,亦即( m m m 为样本数):
损 失 = ∑ i = 1 m 误 差 i 损失 = \sum^m_{i=1}误差_i 损失=i=1∑m误差i
J = ∑ i = 1 m l o s s i J = \sum_{i=1}^m loss_i J=i=1∑mlossi
在黑盒子的例子中,我们如果说“某个样本的损失”是不对的,只能说“某个样本的误差”,因为样本是一个一个计算的。如果我们把神经网络的参数调整到完全满足独立样本的输出误差为 0 0 0,通常会令其它样本的误差变得更大,这样作为误差之和的损失函数值,就会变得更大。所以,我们通常会在根据某个样本的误差调整权重后,计算一下整体样本的损失函数值,来判定网络是不是已经训练到了可接受的状态。
损失函数的作用
损失函数的作用,就是计算神经网络每次迭代的前向计算结果与真实值的差距,从而指导下一步的训练向正确的方向进行。
如何使用损失函数呢?具体步骤:
- 用随机值初始化前向计算公式的参数;
- 代入样本,计算输出的预测值;
- 用损失函数计算预测值和标签值(真实值)的误差;
- 根据损失函数的导数,沿梯度最小方向将误差回传,修正前向计算公式中的各个权重值;
- 进入第2步重复, 直到损失函数值达到一个满意的值就停止迭代。
5.3 机器学习常用损失函数
符号规则: a a a 是预测值, y y y 是样本标签值, l o s s loss loss 是损失函数值。
-
Gold Standard Loss,又称0-1误差
l o s s = { 0 a = y 1 a ≠ y loss=\begin{cases} 0 & a=y \\\\ 1 & a \ne y \end{cases} loss=⎩⎪⎨⎪⎧01a=ya=y -
绝对值损失函数
l o s s = ∣ y − a ∣ loss = |y-a| loss=∣y−a∣
- Hinge Loss,铰链/折页损失函数或最大边界损失函数,主要用于SVM(支持向量机)中
l o s s = max ( 0 , 1 − y ⋅ a ) y = ± 1 loss=\max(0,1-y \cdot a) \qquad y=\pm 1 loss=max(0,1−y⋅a)y=±1
- Log Loss,对数损失函数,又叫交叉熵损失函数(cross entropy error)
l o s s = − [ y ⋅ ln ( a ) + ( 1 − y ) ⋅ ln ( 1 − a ) ] y ∈ 0 , 1 loss = -[y \cdot \ln (a) + (1-y) \cdot \ln (1-a)] \qquad y \in \\{ 0,1 \\} loss=−[y⋅ln(a)+(1−y)⋅ln(1−a)]y∈0,1
-
Squared Loss,均方差损失函数
l o s s = ( a − y ) 2 loss=(a-y)^2 loss=(a−y)2 -
Exponential Loss,指数损失函数
l o s s = e − ( y ⋅ a ) loss = e^{-(y \cdot a)} loss=e−(y⋅a)
5.4神经网络中常用的损失函数
(1)均方差函数,主要用于回归,该函数就是最直观的一个损失函数了,计算预测值和真实值之间的欧式距离。预测值和真实值越接近,两者的均方差就越小。
均方差函数常用于线性回归(linear regression),即函数拟合(function fitting)。公式如下:
l o s s = 1 2 ( z − y ) 2 (单样本) loss = {1 \over 2}(z-y)^2 \tag{单样本} loss=21(z−y)2(单样本)
J
=
1
2
m
∑
i
=
1
m
(
z
i
−
y
i
)
2
(多样本)
J=\frac{1}{2m} \sum_{i=1}^m (z_i-y_i)^2 \tag{多样本}
J=2m1i=1∑m(zi−yi)2(多样本)
(2) 交叉熵损失函数,主要用于分类
交叉熵(Cross Entropy)是Shannon信息论中一个重要概念,主要用于度量两个概率分布间的差异性信息。在信息论中,交叉熵是表示两个概率分布
p
,
q
p,q
p,q 的差异,其中
p
p
p 表示真实分布,
q
q
q 表示预测分布,那么
H
(
p
,
q
)
H(p,q)
H(p,q) 就称为交叉熵:
H ( p , q ) = ∑ i p i ⋅ ln 1 q i = − ∑ i p i ln q i (1) H(p,q)=\sum_i p_i \cdot \ln {1 \over q_i} = - \sum_i p_i \ln q_i \tag{1} H(p,q)=i∑pi⋅lnqi1=−i∑pilnqi(1)
交叉熵可在神经网络中作为损失函数, p p p 表示真实标记的分布, q q q 则为训练后的模型的预测标记分布,交叉熵损失函数可以衡量 p p p 与 q q q 的相似性。
显示只变化b时loss的变化情况
def CalculateCostB(x,y,n,w,b):
B = np.arange(b-1,b+1,0.05)
Loss=[]
for i in range(len(B)):
z = w*x+B[i]
loss = CostFunction(x,y,z,n)
Loss.append(loss)
plt.title(“Loss according to b”)
plt.xlabel(“b”)
plt.ylabel(“J”)
plt.plot(B,Loss,‘x’)
plt.show()
显示只变化w时loss的变化情况
def CalculateCostW(x,y,n,w,b):
W = np.arange(w-1,w+1,0.05)
Loss=[]
for i in range(len(W)):
z = W[i]*x+b
loss = CostFunction(x,y,z,n)
Loss.append(loss)
plt.title(“Loss according to w”)
plt.xlabel(“w”)
plt.ylabel(“J”)
plt.title = “Loss according to w”
plt.plot(W,Loss,‘o’)
plt.show()
同时变化w和b时loss的变化情况
def CalculateCostWB(x,y,n,w,b):
W = np.arange(w-10,w+10,0.1)
B = np.arange(b-10,b+10,0.1)
Loss=np.zeros((len(W),len(B)))
for i in range(len(W)):
for j in range(len(B)):
w = W[i]
b = B[j]
a = w*x+b
loss = CostFunction(x,y,a,n)
Loss[i,j] = loss
在一张图上分区域显示b的4种取值的loss情况
def show_cost_for_4b(x,y,n,w,b):
fig,((ax1,ax2),(ax3,ax4))=plt.subplots(2,2)
a1 = wx+b-1
loss1 = CostFunction(x,y,a1,n)
ShowResult(ax1,x,y,a1,loss1,“z=2x+2”)
a2 = wx+b-0.5
loss2 = CostFunction(x,y,a2,n)
ShowResult(ax2,x,y,a2,loss2,“z=2x+2.5”)
a3 = wx+b
loss3 = CostFunction(x,y,a3,n)
ShowResult(ax3,x,y,a3,loss3,“z=2x+3”)
a4 = wx+b+0.5
loss4 = CostFunction(x,y,a4,n)
ShowResult(ax4,x,y,a4,loss4,“z=2x+3.5”)
plt.show()
学习心得如下:
学习专业知识,提升专业素质。当今社会,科学技术突飞猛进,知识应用期日趋缩短,知识创新日趋鲜明,这要求我们要不断吸取新信息、新知识、新理念,不断充实自己;要不断完善 知识结构,做到博学多才,与时俱进。