1.线性运算模型
当我们说模型时,我们实际上在谈论根据输入x预测输出y的算法。比如,x可以是一个人的工作年限,y可以是他的月薪,我们可以用某种算法来根据一个人的工作年限来预测他的收入。比如y:
y
=
f
(
x
)
=
w
∗
x
+
b
y = f(x) = w∗x+b
y=f(x)=w∗x+b
函数f(x)叫做假设,而w、b是它的参数。我们假设参数w=1000,参数b=200,如果某人的工作年限是5年的话,我们的模型会预测他的月薪为:
y
=
f
(
x
)
=
1000
∗
5
+
500
=
5500
(
元
)
y=f(x)=1000∗5+500=5500(元)
y=f(x)=1000∗5+500=5500(元)
公司如果按照这个模型决定薪酬,我目前工作9年,那么我的工资应该为9500元,这个根本难以覆盖我在北京的生活成本。所以很明显这个模型是一个人工智障。
作为一个薪酬模型,我们考虑的因素太少了,仅仅包含了工作年限一个特征。正常影响薪酬的因素有很多,比如所处的城市、行业、公司、职务等等,如果把这些因素都考虑进去,模型就会更加靠谱。我们把工作年限、城市、行业、公司、职务这些信息,称之为特征。对于一个在北京IT行业工作了10年,目前在互联网公司做产品总监的一位员工,我们可以用这样的一个特征向量来表示:
x
=
(
北京
,
I
T
,
10
,
互联网
,
总监
)
x=(北京,IT,10,互联网,总监)
x=(北京,IT,10,互联网,总监)
输入x变成了一个具备5个特征的向量,相对应的,仅仅一个参数w就不够用了,我们应该使用5个参数,每个特征对应一个(因为每个特征对薪酬的影响程度不同,所以权重参数不同)。这样,我们的模型就变成:
y = f ( x ) = w 1 ∗ x 1 + w 2 ∗ x 2 + w 3 ∗ x 3 + w 4 ∗ x 4 + w 5 ∗ x 5 + b y=f(x)=w_1∗x_1+w_2∗x_2+w_3∗x_3+w_4∗x_4+w_5*x_5+b y=f(x)=w1∗x1+w2∗x2+w3∗x3+w4∗x4+w5∗x5+b
为了书写和计算方便,偏移量b可以按照如下表示:
b = w 0 ∗ x 0 其中 x 0 = 1 b=w_0∗x_0其中x_0=1 b=w0∗x0其中x0=1
这样上面的式子就可以写成
y = h ( x ) = w 1 ∗ x 1 + w 2 ∗ x 2 + w 3 ∗ x 3 + w 4 ∗ x 4 + w 5 ∗ x 5 + w 0 ∗ x 0 y=h(x)=w_1∗x_1+w_2∗x_2+w_3∗x_3+w_4∗x_4+w_5*x_5+w_0∗x_0 y=h(x)=w1∗x1+w2∗x2+w3∗x3+w4∗x4+w5∗x5+w0∗x0
设x向量为:
x
=
(
x
0
,
x
1
,
x
2
,
x
3
,
x
4
,
x
5
)
x=(x_0,x_1,x_2,x_3,x_4,x_5)
x=(x0,x1,x2,x3,x4,x5) w向量为:
w
=
(
w
0
,
w
1
,
w
2
,
w
3
,
w
4
,
w
5
)
w=(w_0,w_1,w_2,w_3,w_4,w_5)
w=(w0,w1,w2,w3,w4,w5);
则上式写成向量的形式为(T:矩阵转置):
y
=
f
(
x
)
=
w
T
x
y=f(x)=w^Tx
y=f(x)=wTx
以上模型就叫做线性模型,因为输出y就是输入特征向量x的线性组合。
2.目标函数
在监督学习下,对于一个样本,我们知道它的特征 x ,以及标记 y 。同时,我们还可以根据模型f(x)计算得到输出
y
‾
\overline{y}
y 。注意这里面我们用y表示训练样本里面的标记,也就是实际值;用带上划线的
y
‾
\overline{y}
y 表示模型计算的出来的预测值。我们当然希望模型计算出来的
y
‾
\overline{y}
y和y越接近越好。数学上有很多方法来表示两者的接近程度,比如我们可以用两者的的差的平方的1/2来表示它们的接近程度(乘1/2,是为了后面计算方便)。
E
=
1
2
(
y
−
y
‾
)
2
E = \frac{1}{2}(y-\overline{y})^2
E=21(y−y)2
我们把E叫做单个样本的误差。
训练数据中会有很多样本,比如N个,我们可以用训练数据中所有样本的误差的和,来表示模型的误差E,也就是
e
=
e
1
+
e
2
+
e
3
+
.
.
.
+
e
n
e = e_1+e_2+e_3+...+e_n
e=e1+e2+e3+...+en
上式的
e
1
e_1
e1表示第一个样本的误差,
e
2
e_2
e2表示第二个样本的误差…。
E
=
e
1
+
e
2
+
e
3
+
.
.
.
+
e
n
=
∑
i
=
1
n
e
i
=
1
2
∑
i
=
1
n
(
y
i
−
y
i
‾
)
2
E = e_1+e_2+e_3+...+e_n \\ =\sum_{i=1}^{n} e_i \\ = \frac{1}{2} \sum_{i=1}^{n} (y_i-\overline{y_i})^2
E=e1+e2+e3+...+en=i=1∑nei=21i=1∑n(yi−yi)2
其中
y
i
为样本中的目标值
y
i
‾
=
f
(
x
i
)
=
w
T
x
i
y_i为样本中的目标值 \\ \overline{y_i} =f(x_i) = w^Tx_i
yi为样本中的目标值yi=f(xi)=wTxi
x
i
x_i
xi表示第i个训练样本的特征
y
i
y_i
yi表示第个i样本的标记,我们也可以用元组
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi)表示第i个训练样本。
y
i
‾
\overline{y_i}
yi则是模型对第i个样本的预测值,通过算法计算得出。
对于模型来说,误差最小越好,也就是E的值越小越好。对于特定的训练数据集来说,
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi)的值都是已知的,所以E其实是参数w的函数。
E
(
w
)
=
1
2
∑
i
=
1
n
(
y
i
−
y
i
‾
)
2
=
1
2
∑
i
=
1
n
(
y
i
−
w
T
x
i
)
2
E(w) = \frac{1}{2} \sum_{i=1}^{n} (y_i-\overline{y_i})^2 \\ = \frac{1}{2} \sum_{i=1}^{n} (y_i-w^Tx_i)^2
E(w)=21i=1∑n(yi−yi)2=21i=1∑n(yi−wTxi)2
由此可见,模型的训练,实际上就是求取到合适的w,使E取得最小值。这在数学上称作优化问题,而E(w)就是我们优化的目标,称之为目标函数。
3.梯度下降优化算法
求函数的极值或者最小值,是一个很简单的数学概念。函数y=f(x)的极值点,就是它的导数f′(x)=0的那个点。因此我们可以通过解方程f′(x)=0,求得函数的极值点(x0,y0)。
计算机不会解方程。但是它可以凭借强大的计算能力,一步一步的去把函数的极值点『试』出来。如下图所示:
首先,我们随便选择一个点开始,比如上图的x0点。接下来,每次迭代修改x的为x1,x2,x3,…,经过数次迭代后最终达到函数最小值点。
你可能要问了,为啥每次修改的值,都能往函数最小值那个方向前进呢?这里的奥秘在于,我们每次都是向函数y=f(x)的梯度的相反方向来修改x。什么是梯度呢?翻开大学高数课的课本,我们会发现梯度是一个向量,它指向函数值上升最快的方向。显然,梯度的反方向当然就是函数值下降最快的方向了。我们每次沿着梯度相反方向去修改x的值,当然就能走到函数的最小值附近。之所以是最小值附近而不是最小值那个点,是因为我们每次移动的步长不会那么恰到好处,有可能最后一次迭代走远了越过了最小值那个点。步长的选择是门手艺,如果选择小了,那么就会迭代很多轮才能走到最小值附近;如果选择大了,那可能就会越过最小值很远,收敛不到一个好的点上。
按照上面的讨论,我们就可以写出梯度下降算法的公式
x n e w = x o l d − η ∇ f ( x ) x_{new} = x_{old} −η∇f(x) xnew=xold−η∇f(x)
其中,∇是梯度算子,∇f(x)就是指f(x)的梯度。η是步长,也称作学习速率。
梯度下降算法可以写成
w n e w = w o l d − η ∇ E ( w ) w_{new}=w_{old}−η∇E(w) wnew=wold−η∇E(w)
如果要求目标函数的最大值,那么我们就应该用梯度上升算法,它的参数修改规则是
w n e w = w o l d + η ∇ E ( w ) w_{new}=w_{old}+η∇E(w) wnew=wold+η∇E(w)
有了上面这个式子,我们就可以根据它来写出训练线性单元的代码了。不断优化到最优值附近,把W权重存起来,就是一个训练好的模型。有新的x数据,通过w就能预测比较准的y值。
4.小结
事实上,一个人工智能算法其实只有两部分
- 模型从输入特征x预测输入y的那个函数f(x)
- 目标函数 目标函数取最小(最大)值时所对应的参数值,就是模型的参数的最优值。很多时候我们只能获得目标函数的局部最小(最大)值,因此也只能得到模型参数的局部最优值。
因此,如果你想最简洁的介绍一个算法,列出这两个函数就行了。
接下来,你会用优化算法去求取目标函数的最小(最大)值。[随机]梯度{下降|上升}算法就是一个优化算法。针对同一个目标函数,不同的优化算法会推导出不同的训练规则。我们后面还会讲其它的优化算法。
其实在机器学习中,算法往往并不是关键,真正的关键之处在于选取特征。选取特征需要我们人类对问题的深刻理解,经验、以及思考。而神经网络算法的一个优势,就在于它能够自动学习到应该提取什么特征,从而使算法不再那么依赖人类,而这也是神经网络之所以吸引人的一个方面。