0
点赞
收藏
分享

微信扫一扫

同是程序员,为什么别人可以事半功倍?


码仔 M 是一家公司的程序员,他和大佬 Z 两人亦师亦友。最近他们都在搞深度学习。大佬 Z 经常默默修炼,而码仔 M 就不同了,他热衷于在朋友圈集赞换取各种免费课程,就好像集得越多学得越好一样。这不他又开始了……

同是程序员,为什么别人可以事半功倍?_拟合

同是程序员,为什么别人可以事半功倍?_数据_02

码仔 M 内心 OS:“嘿嘿嘿!一时集赞一时爽,一直集赞一直爽。”

同是程序员,为什么别人可以事半功倍?_数据_03

同是程序员,为什么别人可以事半功倍?_数据_04

码仔 M 心想:“啥时候能摆脱这种蚂蚁的命运呢?愁!”

同是程序员,为什么别人可以事半功倍?_深度学习_05

同是程序员,为什么别人可以事半功倍?_深度学习_06

大佬 Z 终于忍不住了,准备亲自出手教教这位小朋友。

比如,我们可以利用神经网络来做一些数据的预测。那么首先,我们希望神经网络模型可以学习到目标数据随输入数据的变化规律。比如,对于以下目标数据:

同是程序员,为什么别人可以事半功倍?_深度学习_07

当我们要求神经网络模型拟合这些数据时,我们希望模型可以根据输入得到一条曲线,在一定程度上,它与原数据的变化规律是相同的:

同是程序员,为什么别人可以事半功倍?_数据_08

这样如果我们不考虑过拟合的问题,理论上模型就能根据给予的输入,得出符合数据规律的结果。

那么神经网络模型是如何产生像上面那样的拟合曲线的?首先看一下最简单的单神经元模型:

同是程序员,为什么别人可以事半功倍?_深度学习_09

它只有一个输入层单元,其中 x 表示输入的数据;一个隐含层单元,其中 w 是输入单元到隐含单元的权重;b 是隐含层单元的偏置;一个输出层单元,其中 w' 是隐含层到输出层的权重。

这个最简单的神经网络就是一个从 x 映射到 y 的函数,即 y = w’ σ(wx+b)。w、b 和 w' 是这个函数的参数,其中 σ 表示 sigmoid 函数。当 w=1,w'=1,b=0 的时候,这个函数的图像如下:

同是程序员,为什么别人可以事半功倍?_数据_10

这就是 sigmoid 函数即 σ(x) 的形状和数学表达式。当我们改变 w、b 和 w' 这些参数的值的时候,函数的图形也会发生相应的改变。

可以尝试在保持其它参数不变的情况下,改变其中的一个参数,观察这个参数对函数图像的影响。

首先保持 w'=1, b=0 不变,改变 w 的大小,其函数图形的变化如下图所示。

同是程序员,为什么别人可以事半功倍?_拟合_11

从上图中可以看到,当 w>0 的时候,w 的大小控制着函数的弯曲程度。w 越大,函数曲线在 0 点附近的弯曲程度就会越大(曲线越陡)。而当 w<0 的时候,曲线发生了左右翻转。

再来看看参数 b 对曲线的影响,即保持 w=w'=1,改变 b 的大小。

同是程序员,为什么别人可以事半功倍?_拟合_12

可以清晰地看到,b 控制着 sigmoid 函数曲线的水平位置。b>0,函数图形往左平移;反之往右平移。

最后,来看看 w' 是如何影响函数曲线的。

同是程序员,为什么别人可以事半功倍?_数据_13

不难看出,当 w' > 0 的时候,w' 控制着曲线的陡峭程度;当 w' < 0 的时候,曲线的方向发生上下颠倒。

可见,通过控制 w、w' 和 b 这 3 个参数,可以任意调节从输入 x 到输出 y 的函数形状。

但是,无论如何调节,这条曲线永远都是 S 形(包括倒 S 形)的。要想得到更加复杂的函数图像,则需要引入更多的神经元。

下面把模型做得更复杂一些,看看两个隐含层神经元会对曲线有什么影响,如下图所示。

同是程序员,为什么别人可以事半功倍?_深度学习_14

输入信号进入网络之后就会兵分两路,一路从左侧进入第一个神经元,另一路从右侧进入第二个神经元。这两个神经元分别完成计算,并通过 w'1 和 w'2 进行加权求和得到 y。所以,输出 y 实际上就是两个神经元的叠加。这个网络仍然是一个将 x 映射到 y 的函数,函数方程为:

同是程序员,为什么别人可以事半功倍?_数据_15

在这个公式中,有 w1, w2, w'1, w'2, b1, b2 这样 6 个不同的参数。它们的组合也会对曲线的形状有影响。

例如,可以取 w1=w2=w'1=w'2=1,b1=-1,b2=0,则该函数的曲线形状如下图所示。

同是程序员,为什么别人可以事半功倍?_数据_16

从上图可以看到,合成的函数图形变为了一个具有两个阶梯的曲线。让我们再来看一个参数组合,w1=w2=1,b1=0,b2=-1,w'1=1,w'2=-1,则函数图形如下图所示。

同是程序员,为什么别人可以事半功倍?_数据_17

通过以上的参数组合,我们合成了一个具有单一波峰的曲线。一般地,只要变换参数组合,就可以用两个隐含层神经元拟合出任意具有单峰的曲线。

那么,如果有 4 个或者 6 个甚至更多的隐含层神经元,不难想象,就可以得到具有双峰、三峰和任意多个峰的曲线,我们可以粗略地认为两个神经元可以用来逼近一个波峰(波谷)。

所以,回到最初提出的目标数据,像这样的数据或许只需要具有 10 个左右神经元的模型就可以拟合。

同是程序员,为什么别人可以事半功倍?_数据_08

当然,仅仅能做到拟合还不够,在实际使用中我们要考虑泛化,要考虑过拟合情况,而这就需要更进一步的解释了。

同是程序员,为什么别人可以事半功倍?_拟合_19

同是程序员,为什么别人可以事半功倍?_数据_20

同是程序员,为什么别人可以事半功倍?_拟合_21

同是程序员,为什么别人可以事半功倍?_拟合_22

听说从这之后,码仔 M 朋友圈里的好友们已经有好一段时间没有看到过他了......


举报

相关推荐

0 条评论