栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

跟李沐学AI——动手学深度学习Pytorch版

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

跟李沐学AI——动手学深度学习Pytorch版

跟李沐学AI——动手学深度学习Pytorch版
  • 前言
  • D1-2021.9.22
    • 02
      • (插个眼)
    • 03
    • 04
  • D2-2021.9.23
    • 05
  • D3-2021.9.24
    • 06
    • 07
      • (插个眼)
  • D4-2021.9.25
    • 08
  • D5-2021.9.26
    • 09

前言

升学之后开始接触机器学习、大数据、人工智能等方面内容,笔者深知自身知识不够,故利用课余时间向各路大神求教。希望每天都能进步一点点。
跟李沐学AI——学习地址:动手学深度学习Pytorch版

D1-2021.9.22 02

过去八年最热:计算机视觉结合自然语言分析处理
深度学习在一些应用上的突破:

  1. 图片分类:做的很好了
  2. 物体检测和分割:物体检测:看一个物体在哪;物体分割:看每个像素到底是什么物体 更深层次
  3. 样式迁移:样式图片和内容图片合成 类似于加滤镜
  4. 人脸合成
  5. 文字生成图片
  6. 文字生成:gpt3 回答问题、写代码
  7. 无人驾驶

深度学习案例研究:广告点击 用户输入以后怎么样给用户展示广告
触发-点击率预估(最重要)-排序(点击率*竞价)
点击率预估:预测和训练 特征提取-模型-点击率预测
训练模块:训练数据-特征和用户点击(特征提取)-模型(放入训练)

模型的可解释性(机器学习在图片分割领域为什么有效等)是深度学习的关注点——暂时不关注
符号学可以跟深度学习结合(图神经网络)

(插个眼)

如何寻找自己想要的方向的paper?后面介绍

03

本地安装

由于pip没有-y选项,评论区给出多种解决方案,本人选择:

也可以:

下载wget:使用wget (wget for windows)
然后直接在文件夹里解压压缩包也可以 我没有用到unzip
然后在jupyter notebook里就有了
上课所用到的幻灯片形式的jupyter需要下载一个插件:

pip install rise
04

机器学习数据结构介绍
最主要:N维数组
0维:标量 1维:向量 2维:矩阵 3-d:rgb图片(通道×宽×高) 4-d:一个rgb的批量 (批量大小×宽×高×通道) 5-d:一个视频批量(批量大小×时间×宽×高×通道)
创建数组:形状、每个元素的数据类型、每个元素的值
访问元素:一个元素[1,2] 一行[1,:] 一列[:,1] 子区域[1:3,1:](第一行到第二行 右边是开区间 第一列到最后一列) 子区域[::3,::2](第0行到最后一行 但是每三行一跳 第0列到最后一列 但是每两列一跳)

数据操作:转到jupyter notebook–>chapter_preliminaries–>ndarray
(jupyter notebook可通过ctrl+回车直接运行)
torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]).shape 可以显示这个数组的形状(现在是[3,4])
torch.cat((X, Y), dim=0) 在第0维将XY连接起来 即Y连在X的每一行下面 如果dim=1 就是按列连接在一起 Y连在X的每一列后面
广播机制:a b两个张量形状不同 但是维数相同 将两个张量复制成形状相同的张量就可以相加 注意维数一定要一样
X[-1] 最后一行 X[1:3] 第一行和第二行 X[:] 整个矩阵
id:类似于C++的指针
关于内存分配有时候需要注意!

数据预处理:转到jupyter notebook–>chapter_preliminaries–>pandas
数据预处理指的是将原始数据读取进来 然后通过机器学习的方法进行数据预处理(将csv的数据读取进来变成张量)
csv文件:每一行是一个数据 每个域是用逗号分开
有关reshape:

a = torch.arange(12)
b = a.reshape((3,4))
b[:] = 2
a

最后a的值全部会变成2
b相当于创建了一个a的view 然后b的值改变了 a的值相应也改变了(类似于引用?)

D2-2021.9.23 05

范数:向量范数指的是度量向量“长短”的量,但两个向量在不同的范数下比较“可长可短”。(来自知乎)
再引用一个知乎里关于范数的解答:矩阵的范数是一个什么样的概念

范数的引入是有内在逻辑的,是从:{单个数的绝对值}到{向量的范数}到{矩阵范数} 这个逻辑走的
绝对值非常好理解,表达了数到数的距离,而且对于一个确定的数,可以定义的距离也只有这一种概念。
接下来到了向量(一维数组),很自然的,我们在高中数学中就引入了向量长度的概念,而这种长度定义是基于人类熟悉的欧氏空间的,类似于空间中两点的距离。既然向量中包含的是一组数,我们能不能抛去这种想当然的长度定义,去寻找同样可以在某种意义上表征向量“大小”的量呢?答案是肯定的,比如数组中各个元素的绝对值之和,可以定义为1-范数;数组中绝对值最大的元素,定义为∞-范数,等等。而之前的向量长度则可定义为2-范数。这样定义下,可以很容易看出范数的“大小”量度作用:如果有任意一个范数为0,则其他范数一定为0,且向量为0向量。某种程度上可以充当单个数中的‘绝对值’。
同理,到了矩阵这里,变成了2维数组,那我们可以由向量中范数的定义继续引申,然后添加一些只在矩阵中有意义的范数。对于从向量中引申出来的,称之为诱导范数,诱导即是引申的意思。列模和最大者称为1-范数,行模和最大者称为∞-范数,等等。同样的,这里的范数有度量矩阵“大小”的作用:如果有任意一个范数为0,则其他范数一定为0,且矩阵为0矩阵。某种程度上可以充当单个数中的‘绝对值’。
举个形象的例子:对于一组长方体,我可以定义棱长范数为最长的棱的长度,体积范数为体积,面范数为面积最大的面的面积。这样我可以通过某种范数去比较不同长方体在某种意义上的大小,而且很容易知道如果有任意一个范数为0,则其他范数一定为0

这样 就能比较好的理解范数了
常用到F范数
正定矩阵:这个矩阵乘以任何一个列向量和行向量都大于等于0
置换矩阵:用来交换一个矩阵的某两行/两列的矩阵
特征向量:不会被矩阵改变方向 对称矩阵可以找到特征向量 但不是每个矩阵都能找到特征向量

转到chapter_preliminaries->linear-algebra
B=A:不分配内存 直接建立一个索引
B=A.clone():给B再分配一个内存空间


所以

In21那边需要keepdim求出sum_A以后才能跟A进行计算

torch.norm():求范数
区分行向量和列向量要用矩阵表示
对于一个三维向量sum(axis=[0,1])怎么求?笔者自己实验结果如下:

D3-2021.9.24 06

亚导数:将导数扩展到不可微的函数
梯度:将导数扩展到向量

图解:x、y都是标量–>标量
x、y中有一个是向量–>向量
两个都是向量–>矩阵

标量对列向量的导数是一个行向量:

举例:

梯度指向值变化最大的方向 机器学习求解的核心思想
标量对向量求导计算规则:

向量对标量求导:y是列向量,x是标量,求导是列向量

向量对向量求导 会得出一个矩阵(两个都是列向量)
求解过程:先将y向量的每一项拆解出来 然后逐个对x向量求导 y的每一项是个标量 这时候又转换成标量对向量求导问题 这时候每个标量对向量求导得出的都是一个行向量 组合在一起就成了一个矩阵!

计算规则:

(I是对角线元素全为1,其他元素为0的矩阵)
拓展到矩阵求导:

图解:向量x被求导以后 (n,1)要转成(1,n) 矩阵X被求导后 (n,k)要转成(k,n) yyY的行列数是永远放在前面的(该观点仅用于笔者个人记忆 如果听不懂请自行去看李沐大神讲解)

本期Q&A中提到的p问题和np问题 找了一个简单的解答 引用自:怎么理解P问题和NP问题

P就是能在多项式时间内解决的问题,NP就是能在多项式时间验证答案正确与否的问题。用大白话讲大概就是这样。所以P是否等于NP实质上就是在问,如果对于一个问题我能在多项式时间内验证其答案的正确性,那么我是否能在多项式时间内解决它?这个表述不太严谨,但通俗来讲就是如此。
再说说NP-hardness和NP-completenes. 这里涉及一个概念,不妨称为问题之间的归约。可以认为各个问题的难度是不同的,表现形式为,如果我可以把问题A中的一个实例转化为问题B中的一个实例,然后通过解决问题B间接解决问题A,那么就认为B比A更难。通过对归约过程做出限制可以得到不同类型的归约。复杂度理论里经常用到的规约叫polynomial-time Karp’ reduction。其要求是转化问题的过程必须是多项式时间内可计算的。到这为止NP-hardness和NP-completeness就很好理解了。称问题L是NP-hard,如果任意一个NP的问题都可以多项式规约到L。如果一个NP-hard的问题L本身就是NP的,则称L是NP-complete。这个定义可以推广到所有复杂度类。所以compleness的直观解释就是,我能解决这个问题就相当于具备了用相同级别的计算资源解决这个复杂度类里所有问题的能力。
———————————————————————————————————————————
P:算起来很快的问题
NP:算起来不一定快,但对于任何答案我们都可以快速的验证这个答案对不对
NP-hard:比所有的NP问题都难的问题
NP-complete:满足两点:1. 是NP hard的问题 2. 是NP问题

07

向量链式法则:

例子:

先分解 然后用链式法则

神经网络太大了 手写不现实 因此要用到自动求导
自动求导:计算一个函数在指定值上的导数
计算图:(pytorch可以不知道)

显式构造:(tensorflow也可以)

隐式构造也可以(pytorch)
自动求导的两种模式:正向累积和反向传递

正向累积:先算第一个和第二个 然后这个的解再跟第三个求…直到最后一个
反向传递(反向累积):先选最后一个和倒数第二个 然后这个的解再跟倒数第三个求…直到第一个(在人工智能里面比较出名?bp神经网络?)

反向累积先正向遍历一次 再反向遍历一次 就可以得出结果
反向累积的步骤就是先构造计算图 然后通过一次正向遍历计算中间结果并存储 然后再反向遍历一次 其中可以去掉不用的枝
复杂度:反向:

正向:

(插个眼)

[DL]自动微分–向前模式和反向模式

  1. 正向累积和反向累积 推导过程还是需要再找个大佬讨论确认一下
  2. 正向累积的计算复杂度 O(n)是计算一个变量梯度的复杂度?
  3. 还有就是说为什么反向累积比正向累积更好 有一条弹幕说反向累积是从根节点向下扫描 每个节点只要扫描一次 但是正向累积是从叶节点向上扫描 导致上层节点可能需要被重复扫多次 而且正向中子节点比父节点更先扫描 因此无法像反向把计算结果传给每个子节点------->我觉得讲的很好 但是我还要再想想

转到chapter_preliminaries–>autograd
torch.dot()求内积
y(标量)对x求导的验算:

为什么x的梯度会=4x?因为前面y的计算公式是2x和x的内积 转成数学公式就相当于y=2*(x1²+x2²+x3²+x4²) 标量对向量求导是对向量的每个分量进行求导 因此y对每个分量求导以后就是y’=2*(2x1+2x2+2x3+2x4) 也就是4x 所以拿x.grad==4x来验算是否计算错误

在默认情况下 pytorch会累积梯度 所以需要清除之前计算过的梯度x.grad.zero_()
隐式执行计算流比显式好的点在于对控制流计算的好 但是代价比较大

D4-2021.9.25 08

线性回归是机器学习基础
线性模型可以看作是单层的神经网络:输入的维度是n 输出的维度是1 每个箭头代表一个权重(权重是一样的)
损失函数:模型在每个数据上的损失求均值就是损失函数 目标是找到合适的w和b 使得损失函数的值最小
线性回归有显式解(其他都没有显式解 因为有显式解的模型比较简单)

优化算法:
梯度下降(当没有显式解的时候):重复迭代初始值 用学习率沿着梯度下降的(负梯度)的方向减少损失函数的值
学习率:沿着负梯度的方向走的距离 超参数(需要人为指定)太小会走的步数太多 增加开销 太大会导致一直震荡
常见的梯度下降版本:小批量随机梯度下降(深度学习默认):随机采样b个样本来近似损失
批量大小b是另一个重要的超参数 太小不适合并行利用计算资源 太大增加内存消耗 浪费计算(极端情况:所有样本相同)
总结:梯度下降就是不断的沿负梯度方向更新参数求解 不需要知道显式解 只要不断自动求导

转到chapter_linear-networks–>linear-regression-scratch、linear-regression-concise
d2l.plt.scatter(features[:, 1].detach().numpy(), labels.detach().numpy(), 1);这边需要一个detach是要把数值分离出来 让他不再含有梯度
(这两个代码的例子都只是让我们理解线性回归模型用的 不太实用 看一下过程 原理 用的函数我觉得就可以了…)

D5-2021.9.26 09

softmax回归:一个分类问题
回归:估计一个连续值 单连续数值输出 与真实值的区别的损失值
分类:预测一个离散类别 多个输出 输出是预测为第几类的置信度
从回归到分类:先对类别编码 用均方损失训练 需要对正确类的置信度比其他置信度高的多 或者输出匹配概率 比较真实值概率与预测值概率的区别作为损失
交叉熵衡量两个概率的区别(作为损失) 损失的梯度是真实概率和预测概率的区别

损失函数:

  1. 均方损失L2 loss 导数决定如何更新参数 当预测值跟真实值相差比较多的时候 对参数更新比较多(根据梯度更新) 预测值跟真实值越接近 参数更新慢 参数更新优化平滑 但是有时候预测值跟真实值相差多的时候不想更新那么多
  2. 绝对值更新L1 loss 预测值和真实值相差的多的时候 梯度是常数 参数更新也不会那么大 但是零点处不可导 且0点附近梯度变化剧烈 当预测值和真实值相差不多时 可能会发生震荡
  3. 鲁棒损失Huber’s robust loss 预测值和真实值差的比较多的时候 绝对值更新误差 差的不多的时候 均方误差 优缺点就是综合了前两者
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/269851.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号