算法工程师13——机器学习强化

本文深入浅出地介绍了机器学习中的关键概念和技术,包括自动编码器、生成对抗网络(GAN)、迁移学习、模型可解释性、模型压缩、终身学习、进化算法、贝叶斯网络、粒子滤波、高斯定理及深度强化学习等。并通过实例帮助读者理解这些概念的实际应用。

下面的都特别好理解,理解了思想很重要,代码很简单。

1 自动编码器

在这里插入图片描述

1.1 原理

自动编码器就是编码和解码两个过程,一点也不神秘!!!
编码就是抽象特征,解码就是再复原等
比如Unet就是一个自动编码器

卷积神经网络就是加强版的自动编码器,只不过它更强调结果,而不是中间的特征
**加粗样式**

在这里插入图片描述
在这里插入图片描述
欠完备:特征变少,降维
过完备:特征变多,升维

在这里插入图片描述
在这里插入图片描述

1.2 稀疏自动编码器

本来应该是这幅图,一堆连接
在这里插入图片描述
这样连接的网络就变少了
在这里插入图片描述

在这里插入图片描述
损失少和权重少两者不可兼得,所以要加入一个惩罚因子,给这两项赋予一个权重,看你的取舍。
下面把两者都放到损失中去
在这里插入图片描述

1.3 去噪自动编码器

主动将噪声加入到训练数据中,提升模型的鲁棒性

1.4 变分自动编码器

从无到有生成一些数据
为每个隐藏特征生成一个概率分布。在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.4.1 变分自动编码器代码

代码来自黑马课程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.5 受限玻尔兹曼机

在这里插入图片描述

2 生成对抗网络GAN

在这里插入图片描述
在这里插入图片描述
注意有两个网络,那么也就有两个输入输出:
生成器的输入是一组向量,输出是生成的数据
判别器的输入是生成器生成的数据和真实数据,输出是二分类结果。

2.1生成器

在这里插入图片描述
上面的随机噪声是一组组向量,看下图
在这里插入图片描述

2.2 判别器

在这里插入图片描述
在这里插入图片描述

2.3 优化学习过程

就是周而复始的重复下面两个步骤:
在这里插入图片描述

2.4 存在问题

在这里插入图片描述
最大的困难就是很不稳定,很难让生成器和判别器均衡,无法让二者相互正好制衡,势均力敌。

2.5 代码

很简单
主要就是构建一个网络
前半部分就是一个生成器,后半部分就是判别器
训练的时候直接全训练,但是用分为两部分,先训练前半部分网络就是前半部分设置梯度,后半部分不设置梯度)再训练后半部分网络(就是前半部分不设置梯度,后半部分设置梯度)。

2.6 进一步理解

很简单
(1)比如坏蛋造假钞,和银行造验钞机,来回博弈
(2)比如unet从图像生成最后的结果,反过来生成器就是用最后的分布的数据点生成原始图像。 正好和语义分割相反
在这里插入图片描述

3 迁移学习

在这里插入图片描述
在这里插入图片描述

最重要作用的就是能加快训练速度
在这里插入图片描述
数据差不多叫域相似
分类任务相同叫任务相同

下面进行迁徙学习,就是微调其中的一部分,它的原理就是深度学习的浅层网络已经提取好了通用的底层特征,深层网络就是对特征进行组合。
我们相似的任务,它们的底层特征几乎一样,就不用再训练了。
在这里插入图片描述
在这里插入图片描述

4 模型可解释

给出理由是商业,法律和社会的要求。
要让模型可解释:
(1)侠义可解释:为什么这张图片是猫
(2)广义可解释:你认为猫是什么样子

原理:
通过反向传播,得到特征的热力图

比如你解释网络怎么判断是刷牙呢,你通过反向传递得到中间某层的热力图,发现模型在牙刷部分会高亮显示,相对而言做出了一些解释,而不是真的能完全解释。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5 模型压缩

模型中存在很多无用的参数,导致模型参数量大,运算复杂。

模型压缩,压缩参数量和运算量
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
剪枝,剪枝以后挑选出剩余的那些参数和架构,因为剪枝就是在此基础上剪枝的,而不能将剪枝后的结果重新初始化,这样效果不好。
在这里插入图片描述
在这里插入图片描述

5.1 权重剪枝

不是说那些没有连接的地方没有权重了,只是把权重设置为0了,这样参数量还是不变的。
在这里插入图片描述

5.2 神经元剪枝

在这里插入图片描述

5.3 暗知识和知识蒸馏

知识蒸馏,就是把教师网络的结果拿过来,训练学生网络。
构建两个网络:
(1)教师网络(参数多,特征提取能力强)
(2)学生网络(参数少,特征提取能力弱)
先训练教师网络,然后利用教师网络的值训练学生网络。
它们两个网络是一样的,先把教师网络训练好,
训练学生网络的时候,需要把训练数据通过教师网络得到的结果传入到学生网络,这个结果就是每个类的概率,来求学生网络的损失,更好的训练学生网络。
学生网络训练时求损失,有两个损失,一个是与教师网络的结果求损失,一个是与真实结果求损失。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6 终身学习(让模型拥有记忆能力)

实际应用非常不成熟

我们的模型比如你开始给它一个任务,它学习的特别好,
再给第2 个任务进行训练,学习的也特别好,但是此时,它对任务1 的测试结果就不行了,它只对最后一个任务的学习效果好。
也就是它会遗忘之前的任务。没法让它记忆。

在这里插入图片描述

6.1 多任务训练

将多个任务放在一起训练

6.2 利用GAN生成每个任务的数据

每种任务都可以生成

6.3 保留重要权重

把重要的权重参数保留下来

6.4 扩张模型

在这里插入图片描述

6.5 知识蒸馏

在这里插入图片描述
在这里插入图片描述

7 进化算法

进化学习有:遗传算法,模拟退火,蚁群算法等。就是加入随机,防止陷入最小值。
在这里插入图片描述

7.1 遗传算法

在一个条件改变的情况下,对现有的结果进行改进变化,得到条件改变后的最优值。
在这里插入图片描述

8 贝叶斯网络

8.1 贝叶斯思想

在这里插入图片描述
两个派别:
(1)频率派:研究样本的分布就能大致知道概率分布
(2)贝叶斯派:人为样本是固定不变的,但是抽取的结果参数是一个随机变量,它不是固定的,不是安照计算的概率那样分布的。

在这里插入图片描述
敲黑板
敲黑板
敲黑板
在这里插入图片描述

8.2 贝叶斯公式

在这里插入图片描述

在这里插入图片描述
把分母乘过去,就是两边都等于联合概率

8.3 应用理解

在这里插入图片描述

8.4 贝叶斯网络

参考资料:
https://www.cnblogs.com/mantch/p/11179933.html
https://blog.youkuaiyun.com/leida_wt/article/details/88743323

贝叶斯网络=信念网络=有向无环图=概率图模型

就是两部分构成
(1)节点,也就是变量
(2)节点间的箭头,也就是变量的条件概率

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.4.1 贝叶斯网络实例理解

理解了这个就对贝叶斯网络有了清晰的认识了
在这里插入图片描述
在这里插入图片描述

8.4.2 贝叶斯网络3种基本结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面的3中网络结构是构成贝叶斯网络的基础

8.4.3 贝叶斯网络构建

在这里插入图片描述
上图中0代表不发生,1代表发生。
在这里插入图片描述

8.4.3.1构建网络模型的代码特别简单

(1)构建网络结构
(2)构建概率分布的CPD表格
(3)将CPD数据添加到贝叶斯网络结构中,完成贝叶斯网络的构造。

第1个步骤:
在这里插入图片描述
第2个步骤:构建概率分布
在这里插入图片描述
在这里插入图片描述
第3个步骤:将CPD数据加到贝叶斯网络中,并预测
预测的是发生还是不发生
在这里插入图片描述

9 粒子滤波(非线性求解器)

(刚开始可能不理解,看完这一整部分就理解了)
就是不断的改变粒子权重大小
(1)开始随机得到一些预测值,每个值的权重都一样
(2)与真实值比较,估算每个粒子的权重
(3)根据每个离子的权重,产生新粒子,每个粒子的权重仍然一样,但是每个粒子分布的频率由上次得到的权重所决定,这也就是权重的作用。

9.1 图像化理解

现在第一幅图,无法用函数拟合这条曲线,我们就根据黑点求平均值来拟合
在这里插入图片描述

拟合5轮
在这里插入图片描述

注意:
(1)预测:本次的粒子分布是由上次带权重的粒子决定的,本次粒子的平均值就是本次的预测结果。也就是本次的预测结果是由上一轮的粒子和权重决定的。
(2)更新权重,用本次粒子的分布和真实值的大小进行对比,离真实值较近的粒子赋予更大的权重,离真实值较远的粒子赋予更小的权重,离真实值特别远的粒子直接权重设为0.
权重的作用(重采样):某个粒子权重越大,那么在下次传播中,在这个粒子周围生成更多的粒子。
(3)对于目标变化剧烈的预测结果较差,因为都是基于上一次的结果进行下一次预测。

我们比如设置每次生成的粒子个数相同(也可以不同),下图中的黑色点就是根据上次真实值给上次粒子赋予了权重,根据上次粒子的分布和权重生成了本次的粒子,可以看出它和粒子的分布和权重有关。一开始红色的点权重都是相同的。红色的点的平均值就是本次的预测结果。————这样就实现了预测过程

训练的时候,红色的点跟本次真实值进行比较,然后对红色的点赋予权重,生成下一次的粒子分布。
在这里插入图片描述

9.2 粒子滤波深入理解

在这里插入图片描述
求vk和nk

9.2.1 实现代码

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
红色的线来追踪绿色的线

补充上面看不清楚的那两行代码:
在这里插入图片描述

10 高斯定理

数据的分布类似于高斯分布
使用sklearn工具包实现
既可以实现回归,也可以实现分类

四步:
一维高斯分布——多维高斯分布——无限元高斯分布——回归分类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

每个维度服从高斯分布

10.1 回归

在这里插入图片描述

10.2 分类

这里理解比较困难
在这里插入图片描述
在这里插入图片描述

11 深度强化学习((Deep Reinforcement Learning))

强化学习介绍
https://zhuanlan.zhihu.com/p/25239682

通过很少的行为规则控制不能解决实际问题,可采用强化学习方式。

强化学习是机器学习的一个分支,相较于机器学习经典的有监督学习、无监督学习问题,强化学习最大的特点是在交互中学习(Learning from Interaction)。Agent在与环境的交互中根据获得的奖励或惩罚不断的学习知识,更加适应环境。RL学习的范式非常类似于我们人类学习知识的过程,也正因此,RL被视为实现通用AI重要途径。

在这里插入图片描述
在这里插入图片描述

Reward Signal定义的是评判一次交互中的立即的(immediate sense)回报好坏。而Value function则定义的是从长期看action平均回报的好坏。比如象棋中,吃掉对方一个“车”的即时收益很大,但如果因为吃“车”,老“将”被对方吃掉,显然长期看吃“车”这个action是不好的。即一个状态s的value是其长期期望Reward的高低。

Model of the environment:model是对真实世界(environment)的模拟,model建模的是agent采样action后环境的反应。RL中,使用model和planning的方法被称为model-based,反之不使用model而是通过try-and-error学习policy的方法被称为model-free。本文范畴即是model-free。

这个model很难建立

深度学习只是强化学习实现的手段中的一种

11.1 深度学习来实现

(1)AlphaGo
(2)谷歌DeepMind仅根据原始图片就学习和玩2600种雅达利游戏。
在这里插入图片描述
小鸟飞过障碍物:
在这里插入图片描述

在这里插入图片描述

11.2 预处理

实现二分类,但是输入不是单张图像,是多帧图像
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

11.3 构建模型

输入是4帧图像在这里插入图片描述

11.4 模型训练

在这里插入图片描述
在这里插入图片描述

11.5 结果

小鸟可以很好的飞行,穿越障碍物
在这里插入图片描述

11.6 最重要的理解

在深度学习实现强化学习的过程中,那么对应的强化学习的4元组为:

(1)输入的4张图像就是环境State,就是世界的状态
(2)网络模型就是P则是Agent所交互世界,也被称为model,就是它与环境的交互。
(3)模型得到的结果分类就是A,A代表的是Agent的所有动作;
(4)模型训练中的损失就是回报Reward,Reward是一个实数值,代表奖励或惩罚。

12 模拟退火法

这个视频很好:
https://www.bilibili.com/video/BV1NA41187RV?from=search&seid=8716321192059488420
模拟退火法就是在可接受的循环条件下,可以大概率跳出局部最优解的一种算法。
解决了局部最优和循环次数太多的问题

模拟退火法实现求断点,从而让一个q值为最大的案例

# 将模拟退火法运用到地理探测器,模拟退火法

import xlrd
import random
import numpy as np

def q_value(y_value):
    """用于计算q值,分为7类"""
    #  获取要计算的y
    y_number = len(y_value)   #  y的个数

    # 2、从第2个数到倒数第1个数随机选取6个不一样从大到小排列的数,存到breakpoint列表中
    break_point = random.sample(range(1809, y_number-1), 6)
    break_point.sort()

    # 3、得到各层y片段
    y_1 = break_point[0]
    y_class1 = y_value[0:y_1]   #  获取y中第1个数到第一个断点的值,因为已经去掉表头

    y_2 = break_point[1]
    y_class2 = y_value[y_1:y_2]

    y_3 = break_point[2]
    y_class3 = y_value[y_2:y_3]

    y_4 = break_point[3]
    y_class4 = y_value[y_3:y_4]

    y_5 = break_point[4]
    y_class5 = y_value[y_4:y_5]

    y_6 = break_point[5]
    y_class6 = y_value[y_5:y_6]

    y_class7 = y_value[y_6:]    #  从第6个断点到最后

    # 4、计算sst=n*方差,ssw,选每两个断点之间的数。
    var_class1 = np.var(y_class1)    #  第一层方差
    num_class1 = len(y_class1)       #  第一层个数
    ssw = num_class1*var_class1      #  开始的ssw

    var_class2 = np.var(y_class2)
    num_class2 = len(y_class2)
    ssw += num_class2*var_class2     #  ssw累加

    var_class3 = np.var(y_class3)
    num_class3 = len(y_class3)
    ssw += num_class3*var_class3

    var_class4 = np.var(y_class4)
    num_class4 = len(y_class4)
    ssw += num_class4*var_class4

    var_class5 = np.var(y_class5)
    num_class5 = len(y_class5)
    ssw += num_class5*var_class5

    var_class6 = np.var(y_class6)
    num_class6 = len(y_class6)
    ssw += num_class6*var_class6

    var_class7 = np.var(y_class7)
    num_class7 = len(y_class7)
    ssw += num_class7*var_class7     #  得到最后的ssw

    sst = y_number*np.var(y_value)   #  得到sst
    q = 1-ssw/sst

    return q,break_point



def main():
    # 1、打开excel表,找到发生率那一行数据,转换为一个向量y
    table = xlrd.open_workbook("../1模拟退火法数据/2十公里格网数据/9松墨天牛发生率.xlsx", 'rb')  #  得到表格
    sheet1 = table.sheets()[0]     #  得到第一个表格
    y_col = sheet1.col_values(12)    #  获取第13列的列表
    #  print("读取的数据",y_col)
    y_value = y_col[1:]     #  去掉第一行的列名
    y_num = len(y_value)   #  y的个数
    print("一共有%d个数" % y_num)

    #  实现模拟退火
    #  1、定义初试值
    T = 0.1   #  开始温度
    Tmin = 10**(-8)   #  最低温度
    per = 0.98  #  退火速率
    k = 1000    #  循环次数
    q = 0.000001   #   q越大越好
    breakout = list()
    tab = 0  # 用于计数,看看一共循环了多少次

    #  2、循环,两个循环
    while (T>Tmin):
        for i in range(1,k+1):
            tab +=1
            q_new,break_new = q_value(y_value)   #  随机获得断点和新q
            compare = q_new-q  # 看新得到的q是不是比当前的大
            # 如果新得到的q大,那就直接赋值
            if (compare>0):
                q = q_new
                breakout = break_new
            #  否则还要比那个概率
            else:
                #  看看符不符合Metropolis概率
                ekcl = random.random()  #生成0到1之间的随机数
                ekcl +=0.01         #防止最后的时候ekcl几乎为0,导致程序失败,也可以通过多运行两次程序的方法来做
                p = np.e**(compare/T)   #T怎么取T比较合适(e的-2次是0.1多,t最后几乎为0.001,那q的差小于0.002才可以)
                if (p>ekcl):
                    q = q_new
                    breakout = break_new

        T = T*per
        print("执行到第%d次" % tab)
        print("q值为:", q)
        print("断点为:", breakout)



    #  3、取出最后的值
    print("最优的q值为:",q)
    print("断点为:",breakout)


if __name__ == "__main__":
    main()
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太阳花bigdata

如果文章给您带来帮助,感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值