【学习笔记】神经网络的基本原理

【学习笔记】神经网络的基本原理_第1张图片

概念描述

神经网络是一种重要的机器学习算法,可以用于分类、聚类等多种任务。与其他传统算法不同,神经网络回归得到的模型是一个黑盒子,没有显式的公式或代数表达,但是凭借其复杂的结构,学习效果往往更优。

与其他模型求解问题一样,训练神经网络,是一个最优化问题,即找到让模型效果最好的哪些参数。为了解决这个问题,传统算法有的通过数学解析计算理论最优,有的通过启发式算法搜索效果最好。神经网络的做法,是前向传播和反向传递的组合。

前向传播,是将输入值(观测值)经过一层层的计算(包括线性计算和非线性激活)得到输出值的预测值的过程。算法开始之前,线性计算的参数W和b都是随机给出,因此预测值与真实值之间差异很大。

反向传播,是根据预测值与真实值之间的差异,调整模型参数W和b。为了保证调整参数的方向是减小这一差异,这里用到了梯度下降的原理。

通过两个步骤的不断迭代,最终预测值与真实值之间差异将足够小,神经网络的参数将达到最优。这就是模型训练的过程。下面用数学方式表达。


【学习笔记】神经网络的基本原理_第2张图片

数学描述

记观测的输入值为 x x x, 输出为 y y y,模型预测值为 y ^ = f ( x ) \hat{y}=f(x) y^=f(x)
这里 f ( x ) f(x) f(x) 可以是简单的多项式,也可以是复杂的无法写出公示的黑盒子。x下面我们用一个一般线性函数 f ( x ) = w x + b f(x)=wx+b f(x)=wx+b 作为例子进行说明。

初始化神经网络模型时, f ( x ) f(x) f(x)的参数是随机值。对于观测值 x x x,随机参数为 w 0 , b 0 w_0, b_0 w0,b0,计算 f ( x ) = w 0 x + b 0 f(x)=w_0x+b_0 f(x)=w0x+b0就相当于进行前向传播。

此时得到的预测值肯定是不好的,为了评价预测值的准确与否,就需要损失函数。例如一种常见的损失函数是残差平方和 l o s s = ∑ i ( y i ^ − y i ) 2 loss=\sum_i{(\hat{y_i}-y_i)^2} loss=i(yi^yi)2

这里最优化问题就体现出来了,我们希望调整参数 w , b w,b w,b,减小损失函数 l o s s loss loss,相当于把损失函数当做参数的函数,即 l o s s = g ( w , b ) loss=g(w,b) loss=g(w,b)。对于给定的 x 0 , w 0 , b 0 x_0, w_0, b_0 x0,w0,b0,有 g ( w 0 , b 0 ) = ∑ i ( w 0 x i + b 0 − y i ) 2 g(w_0,b_0)=\sum_i{(w_0x_i+b_0-y_i)^2} g(w0,b0)=i(w0xi+b0yi)2

如何调整参数呢?由泰勒公式,知
f ( x + Δ x ) ≅ f ( x ) + Δ x ∇ f ( x ) f(x+\Delta x)\cong f(x)+\Delta x \nabla f(x) f(x+Δx)f(x)+Δxf(x),变形得
f ( x + Δ x ) < f ( x ) , ∀   Δ x ∇ f ( x ) < 0 f(x+\Delta x) < f(x) ,\forall \ \Delta x \nabla f(x) <0 f(x+Δx)<f(x), Δxf(x)<0,对于 w w w这一个参数,带入上式,说明对于特定的 Δ w \Delta w Δw,如果可以保证有
Δ w ∇ g ( w ) < 0 \Delta w \nabla g(w) < 0 Δwg(w)<0,则有
g ( w + Δ w ) < g ( w ) g(w+\Delta w) < g(w) g(w+Δw)<g(w),即将原始 w 0 w_0 w0 移动了一个 Δ w \Delta w Δw 后,损失函数 l o s s loss loss 会下降。

因此计算时取
Δ w = − α ∇ g ( w ) \Delta w = - \alpha \nabla g(w) Δw=αg(w),其中 α \alpha α 称为学习率,是一个很小的正数,可以使得
Δ w ∇ g ( w ) = − α ∇ g ( w ) 2 < 0 \Delta w \nabla g(w)=- \alpha { \nabla g(w)}^2 < 0 Δwg(w)=αg(w)2<0,这样就可以完成任务了。

上述过程用到了梯度下降的原理,反向传播的过程本质上就成为了计算各个参数对于损失函数的梯度值,然后按照这个梯度值进行调整,理论上就可以快速达成收敛。注意,之所以不通过解析的方法,计算偏导数求极值点,是由于实际模型的复杂度很可能导致极值点难以计算,梯度下降却总是可用。

更具体的例子,可以参考pyTorch官方教程,其中手动计算的grad_a,grad_b,grad_c,grad_d正是损失函数对于各个参数的偏导数,与自动计算的结果一致,读者可以推导验证。


神经网络如何通过前向传播和后向传播实现最优化,原理就是如此。无论模型如何发展,复杂的激活函数、更多的隐藏层等等,都不会影响这一基本思想发挥作用。

你可能感兴趣的:(学习笔记,神经网络,学习,机器学习)