《零基础入门深度学习》学习笔记(二)线性单元和梯度下降-代码详解

本文学习原文:零基础入门深度学习(2) - 线性单元和梯度下降 

为了看图参看文献:https://blog.csdn.net/weixin_39121325/article/details/89638932

第一个问题:为何提出线性单元?是感知器不好用了吗?感知器有哪些不足?

答:感知器无法处理:线性不可分问题。

第二个问题: 如何解决上述的问题?什么是线性单元?相对于感知器哪里升级了?

答:为了解决线性不可分问题:将激活函数由原来的阶跃函数(大于阈值跳变。)替换为可导线性函数。这样就成为了一个线性单元。

 对比线性单元和感知器,上下两张图。

 替换了激活函数之后,线性单元将返回一个实数值而不是0,1分类。因此线性单元用来解决回归问题而不是分类问题。


原文中提到几个概念,我们重点回归一下:

  • 模型:根据输入x预测输出y的算法。可以,此处也可参照上一篇我所写,去理解。
  • 特征:我总结认为是:指导我们认识数据的多维度多视角元素。
  • 监督学习、无监督学习、标注、标签、聚类
  • 目标函数、最优化问题:指导我们更新系数w和b的目标。我们的最终目标。
  • 梯度:是一个向量,它指向函数值上升最快的方向。
  • 梯度下降优化算法:函数值下降最快的方向(负梯度)更新权重。

权重更新方式为:w_{new} = w_{old} - \eta \triangledown E(w)。其中,\triangledown梯度算子\triangledown E(w)就是指E(w)的梯度。\eta是步长,也称作学习速率。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)。
  • 目标函数 目标函数取最小(最大)值时所对应的参数值,就是模型的参数的最优值。很多时候我们只能获得目标函数的局部最小(最大)值,因此也只能得到模型参数的局部最优值
  • 接下来,你会用优化算法去求取目标函数的最小(最大)值。[随机]梯度{下降|上升}算法就是一个优化算法。针对同一个目标函数,不同的优化算法会推导出不同的训练规则

目标函数和优化规则。


其实在机器学习中,算法往往并不是关键,真正的关键之处在于选取特征选取特征需要我们人类对问题的深刻理解,经验、以及思考。而神经网络算法的一个优势,就在于它能够自动学习到应该提取什么特征,从而使算法不再那么依赖人类,而这也是神经网络之所以吸引人的一个方面。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值