由于疫情,这一段时间公司不让入职(真的是无聊在家)。翻开之前的深度学习相关笔记以作复习,就随笔写下。TenosrFlow的具体使用网上有许多教程如极客学院的中文文档,这里只记录一些需要注意的知识点。
代价函数的使用
其实机器学习最基本的代价函数就是二次代价函数和交叉熵代价函数
二次代价函数的不足
神经网络中,经常使用 sigmoid 函数作为激活函数(这个函数有些问题,梯度消失、爆炸)。
二次代价函数为:
J ( Θ ) = 1 2 m ∑ i = 1 m ( h ( x i ) − y i ) 2 J(\Theta) = \frac{1}{2m}\sum\limits_{i=1}^{m}{(h(x^{i})-y^{i})^2} J(Θ)=2m1i=1∑m(h(xi)−yi)2
调参方式是反向传播后采用梯度下降算法( Gradient descent ) 进行参数的调整,
∂
J
∂
w
=
(
h
(
x
i
)
−
y
)
h
′
(
x
i
)
x
i
;
\frac{\partial J}{\partial w} = (h(x^{i}) - y)h'(x^{i})x^{i};
∂w∂J=(h(xi)−y)h′(xi)xi;
∂
J
∂
b
=
(
h
(
x
i
)
−
y
)
h
′
(
x
i
)
\frac{\partial J}{\partial b} = (h(x^{i}) - y)h'(x^{i})
∂b∂J=(h(xi)−y)h′(xi)
x
x
x表示神经元的输入,
h
(
x
)
h(x)
h(x)表示激活函数。 w和b的梯度跟激活函数的梯度成正比,梯度越大, w和b的大小调整得越快,训练收敛就越快。
参数沿着梯度方向调整参数大小,不足的地方在于,当初始的误差越大,收敛得越缓慢,也就是说误差大的情况下,其斜率小,参数更新前后变化不大,这就是导致训练越慢的原因。(如初始误差较大,0.98收敛到0,但是导函数为0(斜率几乎为零),权重w更新比较慢)
交叉熵代价函数
C
=
−
1
n
∑
x
y
ln
x
+
(
1
−
y
)
ln
(
1
−
a
)
C= -\frac{1}{n}\sum\limits_{x}{y \ln x + (1-y) \ln (1-a)}
C=−n1x∑ylnx+(1−y)ln(1−a)
其中,
a
=
σ
(
z
)
a = \sigma(z)
a=σ(z) ,
σ
′
(
z
)
=
σ
(
z
)
(
1
−
σ
(
z
)
)
\sigma'(z) = \sigma(z)(1-\sigma(z))
σ′(z)=σ(z)(1−σ(z))
∂ C ∂ w j = 1 n ∑ x x j ( σ ( z ) − y ) ; \frac{\partial C}{\partial w_j} = \frac{1}{n}\sum\limits_{x}{x_j(\sigma(z) -y)}; ∂wj∂C=n1x∑xj(σ(z)−y);
∂ C ∂ b = 1 n ∑ x ( σ ( z ) − y ) ; \frac{\partial C}{\partial b} = \frac{1}{n}\sum\limits_{x}{(\sigma(z) -y)}; ∂b∂C=n1x∑(σ(z)−y);
权值和偏执值的调整与 σ ′ ( z ) \sigma'(z) σ′(z)无关,另外梯度公式中 σ ( z ) − y \sigma(z) -y σ(z)−y表示输出值与真实值的误差,所以当误差越大的时候,参数w和偏执b的调整就越快,训练的速度越快;
可以总结如下:
如果输出的神经元的激活函数是线性的,那么二次代价函数就是一种比较合适的选择,如果是s型的那么就可以选址交叉熵代价函数;
对数似然代价函数
如果交叉熵模型针对二分类问题,那么对数似然代价函数就是针对多分类任务。
如果把原始张量看做一个layer的输入,softmax也可以考虑作为该layer的输出。与针对每个神经元进行S型函数激活不同,softmax的每个输出元素不止与对应的神经元输入有关,而是与整个layer的输入有关。
对数释然函常用来作为 softmax 回归的代价函数, 如果 输出层神经元是 sigmoid 函数,可以采用交叉熵代价函数。而深度学习中更普遍的做法是将 softmax作为最后一层,此时常用的代价函数是对数似然函数。
对数似然代价函与 softmax 的组合和交叉熵与 sigmoid 函数 的组合非常相似。对释然代价在二分类时可以化简为交叉熵代价函数的形式。
- tf.nn.sigmoid_cross_entropy_with_logits()来表示跟sigmoid搭配使用的交叉熵。
- tf.nn.softmax_cross_entropy_with_logits()来表示跟softmax搭配使用的交叉熵。