机器学习-- 神经网络
为什么要有神经网络
通过之前的学习,我们知道了,对于特征-标签呈现线性关系的建模需求,可以利用线性模型搭配梯度下降算法,模型可以在学习的过程中找到接近最优的参数搭配:
但是,对于特征-标签呈现非线性关系的建模需求,我们只接触了构建特征组合等合成特征的方法进行建模,但是,构建特征组合往往需要数据科学家手动进行尝试,可能花费大量时间。
如果模型能在学习中,自动帮我们构建最优特征组合,该多好?
神经网络- 节点和隐藏层
通过构建神经网络,可以使模型学习非线性的关系。
然而,神经网络也是基于线性模型构建的,如何将线性模型改造,以达到非线性的学习效果呢?
先从线形模型开始讲起。
按照预先设定好的权重 W,偏差 b,根据三个输入值,可以计算得到输出值。
下一步,在输入层与输出层之间添加另一个层。在神经网络术语中, 输入层和输出层之间的层被称为隐藏层(Hidden layer)
,隐藏层的节点被称为神经元(Neuron)
。
隐藏层中每个神经元值的计算方式与 线性模型一致:上一层的所有输出*唯一权重+偏差得到下一层的输入, 以及偏差。
如下图所示,每个隐藏层节点会依据具有唯一性的 4 个参数计算;输出层会依据具有唯一性的 5 个参数计算
因此,该神经网络中,总计有 16 +5 = 21 个参数。
神经网络- 激活函数(Activation Function)
从上一节中可以发现,向网络添加隐藏层还不足以表示非线性关系–对线性运算执行的线性运算后,仍然是线性的。
我们需要找到一种将非线性数学运算插入模型的方法。
如果这看起来有点熟悉,那是因为我们在本课程的早些部分实际上就对线性模型的输出应用了非线性数学运算。在逻辑回归模块中,我们通过将模型的输出通过 S 型函数传递,使线性回归模型输出介于 0 到 1 之间的连续值(表示概率)。
我们可以将同样的函数应用于神经网络。
在下图中,在输出每个节点的值之前,我们先应用 S 型函数(也即整个计算公式的最外层嵌套一个 S 型函数):
在这里,S 型函数用作神经网络的激活函数,用于对神经元的输出值进行非线性转换,然后将该值作为输入传递给神经网络下一层的计算。
添加了激活函数之后,隐藏层会产生更大的影响。通过将非线性叠加到非线性上,我们可以对输入和预测输出之间的非常复杂的关系进行建模。简而言之,每一层都会针对原始输入有效地学习更复杂、更高级别的函数。
常用激活函数
广义上,Sigmoid 函数通常指代任何图像近似 S 型的函数,对于上述例子中的函数,称其为逻辑函数更为合适。
修正线性单元(Rectified Linear Unit/ReLU
使用以下算法转换输出:
- 如果输入值 小于 0,则返回 0。
- 如果输入值 大于或等于 0,则返回输入值。