线性模型
构建XOR多层感知器
其中A为 and 操作,B为 or操作, C 为 not操作。
感知器如何学习‘分类’
蓝色点为分类错误的点,蓝黄两部分是由直线 l : 3 x 1 + 4 x 2 − 10 = 0 l:3x_1+4x_2-10=0 l:3x1+4x2−10=0 划分的,其中t黄色部分为 l : 3 x 1 + 4 x 2 − 10 < 0 l:3x_1+4x_2-10<0 l:3x1+4x2−10<0 ,对于蓝色误分点,想让他离直线更近,视频里采用更新参数的方法:
实现感知器算法
- 感知器伪代码:
其中预测为0表示该点在正区域而被错分至负区域;
python实现代码:
import numpy as np
# Setting the random seed, feel free to change it and see different solutions.
np.random.seed(42)
def stepFunction(t):
if t >= 0:
return 1
return 0
def prediction(X, W, b):
return stepFunction((np.matmul(X,W)+b)[0])
def perceptronStep(X, y, W, b, learn_rate = 0.01):
for i in range(len(X)):
y_hat = prediction(X[i], W, b)
if y_hat - y[i]==1:
change = (learn_rate * X[i]).reshape(len(W),1)
W -= change
b -= learn_rate
elif y_hat - y[i]==-1:
change = (learn_rate * X[i]).reshape(len(W),1)
W += change
b += learn_rate
return W, b
# This function runs the perceptron algorithm repeatedly on the dataset,
# and returns a few of the boundary lines obtained in the iterations,
# for plotting purposes.
# Feel free to play with the learning rate and the num_epochs,
# and see your results plotted below.
def trainPerceptronAlgorithm(X, y, learn_rate = 0.01, num_epochs = 25):
x_min, x_max = min(X.T[0]), max(X.T[0])
y_min, y_max = min(X.T[1]), max(X.T[1])
W = np.array(np.random.rand(2,1))
b = np.random.rand(1)[0] + x_max
# These are the solution lines that get plotted below.
boundary_lines = []
for i in range(num_epochs):
# In each epoch, we apply the perceptron step.
W, b = perceptronStep(X, y, W, b, learn_rate)
boundary_lines.append((-W[0]/W[1], -b/W[1]))
return boundary_lines
刚刚的感知器算法实现告诉我们,获取正确分类的方式,就是通过每一个错误分类的点,评估错误点位置与我们期望位置之间的差异,来慢慢的修正我们分类函数。
因为误差暗示了如何进行正确的分类,因此误差的定义就变得尤为重要,这也被称为误差函数。
误差函数和梯度下降
误差函数提供给我们的预测值与实际值之间的差异,但是这个差异如何指导我们权重的更新呢?我们的目标是找到最小的误差函数值来找到与实际值误差最小的预测值。
在简单的线性方程中,我们可以通过判断“预测值与实测值相比是大了还是小了”来决定权重是增加还是减少。但是在更为复杂的非线性环境中呢?复杂的数学问题,我们就直接来看看学者们的解决策略。
假设一维问题是一条直线,那么二维问题就是一个平面,而三维问题就是一个曲面。曲面可以理解为有山峰也有低谷的地面,误差最小的地方就是低谷处,我们希望计算机找到的就是这个低谷的值。为了找到这个低谷,学者们发明了梯度下降。
对于优化而言,连续型误差函数比离散型函数更好。
举个栗子:
以上述分类器为例,当学习步长很小时,分类线 l 移动过小,那么在经过一次移动后,仍有两个错误,这样不能得到任何有效信息去做下一步处理。视频中给了一个生动的例子:离散的损失函数相当于利用梯度下降算法从阿兹台克金字塔上走下来,即在第二个平台上始终看到两个错误,而在连续型损失函数中却可以得到高度的小幅变化信息,知道哪个方向变化最多。
连续性损失函数会因为位置的轻微扰动导致高度发生变化,而阿兹台克金字塔的高度都是以跳跃的形式从2到1到0,为此,我们需要从离散型预测变成连续型预测。
将离散数据转化为连续性数据,即将激活函数(activation function)由0-1阶跃函数转化为sigmoid函数:
其中sigmoid 函数定义为 y = 1 1 + e x p − ( w x + b ) y=\dfrac{1}{1+exp^{-(wx+b)}} y=