本文学习原文:零基础入门深度学习(2) - 线性单元和梯度下降
为了看图参看文献:https://blog.csdn.net/weixin_39121325/article/details/89638932
第一个问题:为何提出线性单元?是感知器不好用了吗?感知器有哪些不足?
答:感知器无法处理:线性不可分问题。
第二个问题: 如何解决上述的问题?什么是线性单元?相对于感知器哪里升级了?
答:为了解决线性不可分问题:将激活函数由原来的阶跃函数(大于阈值跳变。)替换为可导的线性函数。这样就成为了一个线性单元。
对比线性单元和感知器,上下两张图。
替换了激活函数之后,线性单元将返回一个实数值而不是0,1分类。因此线性单元用来解决回归问题而不是分类问题。
原文中提到几个概念,我们重点回归一下:
- 模型:根据输入x预测输出y的算法。可以,此处也可参照上一篇我所写,去理解。
- 特征:我总结认为是:指导我们认识数据的多维度多视角元素。
- 监督学习、无监督学习、标注、标签、聚类
- 目标函数、最优化问题:指导我们更新系数w和b的目标。我们的最终目标。
- 梯度:是一个向量,它指向函数值上升最快的方向。
-
梯度下降优化算法:函数值下降最快的方向(负梯度)更新权重。
权重更新方式为:。其中,
是梯度算子,
就是指
的梯度。
是步长,也称作学习速率。E(w)为目标函数。
对E求梯度后:,这样参数修改规则有了。也即训练规则有了。
通过上图比较,发现除了激活函数f不同之外,两者的模型和训练规则是一样的(在上表中,线性单元的优化算法是SDG算法)。所以此时我们只需要把感知器的激活函数进行替换即可。
# from perceptron import Perceptron
# 定义激活函数
f = lambda x: x
class LinearUnit(Perceptron):
def __init__(self, input_num):
"""初始化线性单元,设置输入参数的个数"""
Perceptron.__init__(self, input_num, f)
def get_training_dataset():
"""
捏造5个人的收入数据。
"""
# 构建训练数据
# 输入向量列表,每一项是工作年限。
input_vecs = [[5], [3], [8], [1.4], [10.1]]
labels = [5500, 2300, 7600, 1800, 11400]
return input_vecs, labels
def train_linear_unit():
"""
使用数据训练线性单元
"""
# 实例化,输入参数的特征维度为1(工作年限)
lu = LinearUnit(1)
# 训练, 迭代10轮, 学习速率为0.01
input_vecs, labels = get_training_dataset()
lu.train(input_vecs, labels, 10, 0.01)
# 返回训练好的线性单元
return lu
def plot(linear_unit):
import matplotlib.pyplot as plt
input_vecs, labels = get_training_dataset()
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(list(map(lambda x: x[0], input_vecs)), labels)
weights = linear_unit.weights
bias = linear_unit.bias
x = range(0, 12, 1)
y = list(map(lambda x: weights[0] * x + bias, x))
ax.plot(x, y)
plt.show()
if __name__ == "__main__":
"""训练线性单元"""
linear_unit = train_linear_unit()
# 打印训练获得的权重
print(linear_unit)
# 测试
print('工作3.6年,月收入 = %.2f'% linear_unit.predict([3.4]))
print('工作10年,月收入 = %.2f'% linear_unit.predict([10]))
print('工作6.3年,月收入 = %.2f'% linear_unit.predict([6.3]))
plot(linear_unit)
小结:
机器学习算法其实只有两个部分:
- 模型 从输入特征x 预测输入y 的那个函数 h(x)。
- 目标函数 目标函数取最小(最大)值时所对应的参数值,就是模型的参数的最优值。很多时候我们只能获得目标函数的局部最小(最大)值,因此也只能得到模型参数的局部最优值。
- 接下来,你会用优化算法去求取目标函数的最小(最大)值。[随机]梯度{下降|上升}算法就是一个优化算法。针对同一个目标函数,不同的优化算法会推导出不同的训练规则。
目标函数和优化规则。
其实在机器学习中,算法往往并不是关键,真正的关键之处在于选取特征。选取特征需要我们人类对问题的深刻理解,经验、以及思考。而神经网络算法的一个优势,就在于它能够自动学习到应该提取什么特征,从而使算法不再那么依赖人类,而这也是神经网络之所以吸引人的一个方面。