了解损失函数,激活和优化
损失函数
损失函数是输出标量值的目标函数,它能让我们了解我们的预测值与原来的预测值有何不同。这些目标函数发现谓词与原始输出之间的差异。在构建神经网络模型时,选择这些损失函数是关键任务。如果我们选择了一个错误的损失函数,它就会破坏我们神经网络模型的结构。
根据神经网络执行的任务,有不同类型的损失函数可用。人们已经声明了以下任务:这些损失函数最有效:
- 二元分类:二元叉熵函数
- 多元分类:分类交叉熵函数
- 回归:均方误差函数
- 等等…
让我们更详细地了解每一个损失函数:
- 交叉熵损失函数:这是损失函数,根据0到1之间的输出概率来评估分类模型的性能。交叉熵也称为对数损失。当我们的预测值偏离ground truth标签时,交叉熵损失会增加。假设你有一个神经网络用于二元分类,比如Dogs vs Cats,我们的最后一层,也就是我们的神经网络的输出层将包含每个例子中两个类的概率。每个概率都在0到1之间,所有的可能之和等于1。这里的输出层使用Softmax激活函数。所以我们最好的预测是对数损失0,而预测的值远离ground truth会有很大的对数损失。假设要预测的类数为M,则:
If M = 2:
log_loss = -(orig*log(predict) + (1-orig)*log(1-predict))
If M > 2:
log_loss = ∑(orig * log(predict)) from P of E = 0 to M
Where, P = Correct probability for example E
E = Example
- 均方误差(MSE):这个函数也称为L2损失。它是原始值和预测值差的平方的总和。
l2_loss = ∑(predict - orig)**2 from 0 to n
- 平均绝对误差(MAE):这个函数也称为L1损耗。它是对原始值和预测值的绝对差值求和。与L1的损失相比,L2的损失对离群值高度敏感,但L1的损失更为稳健。L2损失对离群值是敏感的,因为如果预测值与原始输出不匹配,那么这些差的平方就会很大。由于L1的损失取的是原始值和预测值之间的差的绝对值,所以它对错误的预测并不那么敏感。
l1_loss = ∑ |predict - orig| from 0 to n
激活(ACTIVATIONS)
激活是任何激活函数的输出。任何神经网络层将给定输入与当前层的权重相乘,并向该乘积添加偏差,即线性运算。这种线性操作称为中间激活。由于这些中间激活只需要学习一个简单的线性决策边界,所以为了学习复杂的决策边界,我们将非线性添加到这个中间的激活中,这只是将非线性函数应用于这些中间激活。有许多非线性函数,如sigmoid, ReLu, Leaky ReLu, tanh等,这些被称为激活函数。这些激活函数的输出称为激活。
For hidden layer:
W = Weights (shape = p x f)
X = Inputs (shape = f x n)
B = bias
intermediate_activation = W*X + B = Z
Let,
sigmoid activation function F(z) = 1/(1+e^-z)
A = F(Z) = F(W*X + B)
Here A is called as Activation.
优化
神经网络可以通过多种方式进行优化。超参数调整,小批量梯度下降,批量归一化等是用于优化神经网络的一些技术。
Mini-Batch梯度下降允许我们在许多示例中执行高效计算。在该方法中,大小为m的整个数据集被分成批量大小的bs。因此,批次总数是
Total no. of batches = m / bs
在Mini-Batch中,计算梯度下降模型误差,并且仅在每个小批量结束时更新权重。实施可以变化,以获取批次上所有梯度的总和,或者取批次中所有梯度的平均值。该方法在随机梯度下降(每个例子更新的权重)和批量梯度下降(每个epoch之后更新的权重)之间给出平衡。最快的学习是在Mini-Batch梯度下降。
设置适当的批量大小:
Let M = total no. of samples
For M <= 20,000:
Use batch-gradient descent
For M > 20,000:
set bs = 4, 8, 16, 32, 64, 128, 256, 512
改进梯度下降的另一种更好的方法是使用momentum、RMSprop和ADAM算法。这些是梯度下降优化算法,用来加速收敛到全局最小。掌握指数加权平均数可能有助于更清楚地了解这些优化算法是如何工作的。
加权平均:
- 加权平均数是对给定问题中不同类型的对象计算的平均数。
- 它取决于特定类型的对象的数量。
- 一般来说,加权平均值更接近于具有更多数量的对象类型。
指数加权平均:
Let Vt be the average of current instance.
In general,
Vt = β*Vt-1 + (1-β)*θt
Where,
Vt = Current average
Vt-1 = Previous average
β = Parameter for optimisation of Vt
θ = Current Value
上面的等式告诉我们,为了计算Vt,我们需要Vt-1,这是先前的平均值。
使用momentum的梯度下降:
- momentum可以用来增加梯度下降的收敛速度。
- momentum的步骤:
Compute dW, dB
VdW = β1*VdW + (1-β1)*dW
Vdb = β1*Vdb + (1-β1)*db
W = W - α*Vdw
B = B - α*Vdb
- 在正常梯度下降中,随着学习速率低,沿垂直轴(振幅)的振荡低,因此收敛慢。
- 如果我们提高学习率,这将导致采取更大的steps ,并必然导致divergence。
- 在上述情形下,振荡即垂直轴(振幅,有助于采取更大的步长)变得更高,导致发散。
- 为了避免上述情况,使用momentum算法即梯度下降的指数加权平均来减小垂直轴的振荡,保持沿水平轴常数的收敛始终是一个更好的选择。
使用RMSprop的梯度下降:
这是一种梯度下降优化算法,就像“momentum”一样。
SdW = β2*SdW + (1-β2)*dW2
Sdb = β2*Sdb + (1-β2)*db2
W = W - α*(dW/√(Sdw + ε))
b = b - α*(db/√(Sdb + ε))
Where,
ε = 10^-8
使用ADAM进行梯度下降:
它是momentum和RMSprop的结合。
VdW = β1*VdW + (1-β1)*dW
Vdb = β1*Vdb + (1-β1)*db
SdW = β2*SdW + (1-β2)*dW^2
Sdb = β2*Sdb + (1-β2)*db^2
Adding bias correction to Vdw Vdb Sdw Sdb:
Vdwcorr = Vdw/(1 - βt1`) Vdbcorr = Vdb/(1 - βt1`)
Sdwcorr = Sdw/(1 - βt2`) Sdbcorr = Vdb/(1 - βt2`)
Updating weights:
W = W - (α*Vdwcorr )/√(Sdwcorr + ε)
S = S - (α*Vdbcorr )/√(Sdbcorr + ε)
指数加权平均值的偏差校正由下式给出:
Vt = Vt / (1 - βt)