机器学习
目录
一.安装基本环境
conda/miniconda环境
- 在conda环境里面使用
pip install torch d2l
来安装 - 注意,torch在win环境里面应当去官网找链接下载,并且要看好自己的电脑是否有Nvidia显卡,如果检查无误,再查看Nvidia显卡是否安装了CUDA驱动,根据你的驱动去选择torch的版本。(如果没有Nvidia显卡可以选择CPU版本的torch)
二.数据操作+数据预处理
一维数组二维数组以及多维数组的认识
- 零维数组:单个字符[a]
- 一维数组(向量):[a,b,c...]
- 2-d(矩阵):[[a,b...],[a,b...]]
- 3-d:主要是图片
- 4-d:主要是批量的RGB图片[[]]
- 5-d:视频
访问元素的方法
 #### torch中tenson的应用 (**首先,我们导入`torch`。请注意,虽然它被称为PyTorch,但是代码中使用`torch`而不是`pytorch`。**) **引入torch要用到的是** `import torch` 可以用`torch.arange()`来创建一个顺序的数组 可以用numberelement来获取张量里面的数据数量以及用shape来获取张量的格式 a=torch.zeros((2, 3, 4)) a.numel() a.shape 同样,我们可以创建一个形状为`(2,3,4)`的张量,其中所有元素都设置为1。代码如下: torch.ones((2, 3, 4)) tensor([[[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]], [[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]]]) 有时我们想通过从某个特定的概率分布中随机采样来得到张量中每个元素的值。 例如,当我们构造数组来作为神经网络中的参数时,我们通常会随机初始化参数的值。 以下代码创建一个形状为(3,4)的张量。 其中的每个元素都从均值为0、标准差为1的标准高斯分布(正态分布)中随机采样。 torch.randn(3, 4) ```python tensor([[ 0.4085, 1.1003, 0.6239, -0.6981], [ 0.4395, -0.6122, 0.5716, -0.6712], [ 0.5647, -0.2552, 0.7448, 0.9184]]) ``` 我们还可以\[**通过提供包含数值的Python列表(或嵌套列表),来为所需张量中的每个元素赋予确定值**\]。 在这里,最外层的列表对应于轴0,内层的列表对应于轴1。 torch.tensor(\[\[2, 1, 4, 3\], \[1, 2, 3, 4\], \[4, 3, 2, 1\]\]) ```Pyhton tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]) ``` #### 张量的运算 张量的运算有(+,-,*,/,\*\**)注意这里的运算都是按元素运算 #### 张量的广播 在大多数情况下,我们将沿着数组中长度为1的轴进行广播,如下例子: a **=** torch.arange(3).reshape((3, 1)) b **=** torch.arange(2).reshape((1, 2)) a, b (tensor([[0], [1], [2]]), tensor([[0, 1]])) 由于`a`和`b`分别是3×1和1×2矩阵,如果让它们相加,它们的形状不匹配。 我们将两个矩阵*广播* 为一个更大的3×2矩阵,如下所示:矩阵`a`将复制列, 矩阵`b`将复制行,然后再按元素相加。 a **+** b tensor([[0, 1], [1, 2], [2, 3]]) ### 三.线性代数相关知识 线性代数详情可以参考河海大学线性代数课本,其中有详细的讲解,在这里仅仅列出相关名词和我记忆中的相关知识点,后续可能会有所补充 * 矩阵的加减乘除 * 矩阵的乘法比较特殊,一个m\*n的矩阵和一个n\*l的矩阵相乘得到的是一个m\*l的矩阵 * 矩阵的范数 * 矩阵的特征向量 * 正交矩阵和正定矩阵 * 对称矩阵,反对称矩阵 ### 四.线性回归 * 线性回归的相关知识 举个例子,我们现在有一个函数, y = a x 1 + b x 2 + h y=ax_1+bx_2+h y=ax1+bx2+h 现在已经知道许多不同的\< x 1 x_1 x1, x 2 x_2 x2\> 和他们对应的y值,现在我们想要求解的是未知系数**a** 和**b** 和**h** 在计算机中的计算方法: 我们把a,b包装成一个一行两列的张量\[a,b\]然后给定一个初始值 定义一个loss函数,是预测值和真实值差的平方,这个平方当然是越小越好,最好为零 我们进行求导操作 ∂ l ∂ ω \\frac{\\partial l}{\\partial \\omega} ∂ω∂l然后 ( ω − η ∂ l ∂ w ) \\left( \\omega-\\eta\\frac{\\partial l}{\\partial w}\\right) (ω−η∂w∂l) 其中 η \\eta η是一个超参数,也就是人工自己设定的,这个值的大小是根据多次实验的来的完成一次 相当与更新了一次 ω \\omega ω 经过多组参数多次更新之后就可以得到一个误差相对比较小的参数 #### SoftMax回归问题(分类问题) ##### 什么是分类问题: **分类问题就是给你一张图片,识别图片里的是什么内容** * **实现原理**: * 把图像分割成数个区域,每个区域代表了一个特征值(具体什么原理之后再说,现在就只需要知道可以把一张二维的图片处理成一维的数据)假设这些特征值为 x 1 , x 2 . . . . x n x_1,x_2....x_n x1,x2....xn * 然后确定类别,比如我们要识别一张图片是猫、狗还是鸡。我们就有三个类别 * 接下来我们要知道怎么用输入来计算输出,我们假设输出结果为 o 1 , o 2 . o 3 o_1,o_2.o_3 o1,o2.o3 * 我们令 o 1 = ω 11 x 1 + ω 12 x 2 + ω 13 x 3 o 2 = ω 21 x 1 + ω 22 x 2 + ω 23 x 3 o 3 = ω 31 x 1 + ω 32 x 2 + ω 33 x 3 o_1=\\omega_{11}x_1+\\omega_{12}x_2+\\omega_{13}x_3 \\\\ o_2=\\omega_{21}x_1+\\omega_{22}x_2+\\omega_{23}x_3\\\\ o_3=\\omega_{31}x_1+\\omega_{32}x_2+\\omega_{33}x_3 o1=ω11x1+ω12x2+ω13x3o2=ω21x1+ω22x2+ω23x3o3=ω31x1+ω32x2+ω33x3 * o n o_n on越大代表是当前种类的概率越大,但是这样看仍然不方便,我们更希望它可以直接代表概率。 所以我们可以用 y \^ = e o 1 Σ e o i \\hat{y}=\\frac {e\^{o_1}}{\\Sigma e\^{o_i}} y\^=Σeoieo1 来把其概率化,这样表示出来是一个大于0小于1的数,并且一定是正的我们把这里的 y \^ \\hat{y} y\^记作 y \^ = s o f t m a x ( o ) \\hat{y}=softmax(o) y\^=softmax(o) 由此我们可以求出 y 1 \^ , y 2 \^ , y 3 \^ . . . . . y n \^ \\hat{y_1},\\hat{y_2},\\hat{y_3}.....\\hat{y_n} y1\^,y2\^,y3\^.....yn\^ 他们的和加起来是1,其中数值最大的就是最有可能的分类 * **关于计算** * 我们一般把数据进行矢量化处理, * 假设我们读取了一个批量的样本 X \\mathbf{X} X( x 11 , x 12 . . . x n n x_{11},x_{12}...x_{nn} x11,x12...xnn),其中特征维度(输入数量)为 d d d,批量大小为 n n n。此外,假设我们在输出中有 q q q个类别。那么小批量样本的特征为 X ∈ R n × d \\mathbf{X} \\in \\mathbb{R}\^{n \\times d} X∈Rn×d,权重为 W ∈ R d × q \\mathbf{W} \\in \\mathbb{R}\^{d \\times q} W∈Rd×q,偏置为 b ∈ R 1 × q \\mathbf{b} \\in \\mathbb{R}\^{1\\times q} b∈R1×q。softmax回归的矢量计算表达式为: O = X W + b , Y \^ = s o f t m a x ( O ) . \\begin{aligned} \\mathbf{O} \&= \\mathbf{X} \\mathbf{W} + \\mathbf{b}, \\\\ \\hat{\\mathbf{Y}} \& = \\mathrm{softmax}(\\mathbf{O}). \\end{aligned} OY\^=XW+b,=softmax(O). * 损失函数 l o s s loss loss * 这里要用到一些概率论的知识,似然估计 似然估计简单来说就是,假设我现在有黑白两种颜色的球100个,其中90个是一种颜色,另外10个小球是另一种颜色,我现在拿出一个球是黑色,那我就会猜测黑颜色的球更多,毕竟更趋向于已经发生的时间概率更大。 所以,我们现在假设一个概率分布有一个未知量n,那我我现在不断模拟这个概率分布,得到 x 1 , x 2 . . . x_1,x_2... x1,x2... 那么我会得到这样一个函数 P = ∏ i = 1 k P ( x = x i ; n ) P= \\prod_{i=1}\^k P(x=x_i;n) P=i=1∏kP(x=xi;n) 现在,经过不断的模拟,事件已经发生,所以倾向于P的概率最大,我们就要调整n来让P最大,这就叫似然函数 知道了这些,我们再来定义softmax的损失函数 softmax函数给出了一个向量 y \^ \\hat{\\mathbf{y}} y\^,我们可以将其视为"对给定任意输入 x \\mathbf{x} x的每个类的条件概率"。假设整个数据集 { X , Y } \\{\\mathbf{X}, \\mathbf{Y}\\} {X,Y}具有 n n n 个样本,其中索引 i i i的样本由特征向量 x ( i ) \\mathbf{x}\^{(i)} x(i)和向量 y ( i ) \\mathbf{y}\^{(i)} y(i)组成。 P ( Y ∣ X ) = ∏ i = 1 n P ( y ( i ) ∣ x ( i ) ) . P(\\mathbf{Y} \\mid \\mathbf{X}) = \\prod_{i=1}\^n P(\\mathbf{y}\^{(i)} \\mid \\mathbf{x}\^{(i)}). P(Y∣X)=i=1∏nP(y(i)∣x(i)). 根据最大似然估计,我们最大化 P ( Y ∣ X ) P(\\mathbf{Y} \\mid \\mathbf{X}) P(Y∣X),相当于最小化负对数似然: − log P ( Y ∣ X ) = ∑ i = 1 n − log P ( y ( i ) ∣ x ( i ) ) -\\log P(\\mathbf{Y} \\mid \\mathbf{X}) = \\sum_{i=1}\^n -\\log P(\\mathbf{y}\^{(i)} \\mid \\mathbf{x}\^{(i)}) −logP(Y∣X)=i=1∑n−logP(y(i)∣x(i)) 我们定义损失函数 l o s s loss loss l ( y , y \^ ) = − l o g P ( y ( i ) ∣ x ( i ) ) = − ∑ j = 1 q y j log y \^ j l(\\mathbf{y}, \\hat{\\mathbf{y}}) = -log P(\\mathbf{y}\^{(i)}\|\\mathbf{x}\^{(i)})=- \\sum_{j=1}\^q y_j \\log \\hat{y}_j l(y,y\^)=−logP(y(i)∣x(i))=−j=1∑qyjlogy\^j ### 五.感知机 #### 什么是感知机 感知机是一个和softmax回归十分相似的模型,但是他的输出和softmax不一样,他只输出固定值(比如1和-1)我们定义一个函数取符号 σ ( x ) = { 1 x ≥ 0 − 1 x ≤ 0 \\sigma(x)=\\left\\{ \\begin{matrix} 1 \\qquad x\\ge0\\\\ -1 \\qquad x\\le0 \\end{matrix} \\right. σ(x)={1x≥0−1x≤0 继续假设我们有n个输入**x** ( x 1 , x 2 , x 3 . . . . . . x n x_1,x_2,x_3......x_n x1,x2,x3......xn) 我们再对应n个系数**W** ( w 1 , w 2 . . . . . . w n w_1,w_2......w_n w1,w2......wn) 如果 ( W T x i ) y i ≤ 0 (W\^Tx_i)y_i\\le0 (WTxi)yi≤0那么我们就更新一次函数(和softmax一致,使用的sdg来更新参数),这里可以理解为我们把一个函数变换成它的一般形式,例如 A x + B y + C = 0 Ax+By+C=0 Ax+By+C=0 输入一个 ( x , y ) (x,y) (x,y) 如果大于0就点就会落在直线的上面,反之则在直线下面。 知道了基本的函数之后,我们就可以介绍什么是感知机,最简单的感知机也叫单层感知机,它基本和softmax一样,给定一个输入的向量,乘上对应的权重,得到一个或者数个结果。 之后是更加复杂一点的多层感知机,其实就是在输入和输出之间加入隐藏层,增加系数的个数,也就增加了模型的复杂度,可以拟合更加复杂的模型 额外要注意的一点就是,再隐藏层里我们要避免线性关系,简单来说,我们要使用某些函数,来把线性关系化为非线性我们管这种函数叫做激活函数 其中比较常见的激活函数有relu函数、sigmoid函数等等 r e l u 函数 r e l u ( x ) = m a x ( 0 , x ) s i g m o i d 函数 s i g m o i d ( x ) = 1 1 + e − x relu函数\\\\ relu(x)=max(0,x)\\\\ sigmoid函数\\\\ sigmoid(x)=\\frac {1}{1+e\^{-x}} relu函数relu(x)=max(0,x)sigmoid函数sigmoid(x)=1+e−x1 这两个函数都是可以把线性关系化成非线性关系的函数,只要是隐藏层都要使用到这种激活函数  ### 六.权重衰退和丢弃法 在了解什么是权重衰退之前,我们要知道两个概念,**欠拟合** 于**过拟合** 这两个概念其实非常容易理解 #### 欠拟合和过拟合的概念 ##### 欠拟合 顾名思义,是模型和数据的拟合度并不高,导致了loss很大,识别的也并不准确 ##### 过拟合 这个也很好理解,就是在我们训练数据的时候给的训练数据集是由"个性"的,我们是想要由训练数据集来实现识别,但是如果我们把这些"个性"也学习的很好,那就会出现过拟合,举个容易理解的例子:我们想要机器识别一张图片是不是"人",我们给了它10000个不同的人作为训练集,那么过拟合就是说机器学习的特别好,记住了10000个人每个人精确的样子,这就会导致如果我给他一个10000人以外的人,就不会识别为"人",换句话说,模型认识这10000个人,别人都不认识,一个良好的模型应该是有一定的动态范围,可以识别一个种类的  知道了什么是过拟合和欠拟合之后,我们还要知道什么情况会发生过拟合和欠拟合,这一般和两个原因有关 1.模型的复杂度 2.数据的复杂度 当模型复杂度过高而数据复杂度低的时候,就会出现过拟合,相对的,模型复杂度低但数据复杂度高,就会出现欠拟合 | 复杂度 | 高 | 低 | |-----|-----|-----| | 高 | 合适 | 欠拟合 | | 低 | 过拟合 | 合适 | #### 权重衰退 知道了这个之后我们就可以开始了解什么是权重损失,所谓权重损失,就是把我们的权重控制在一个范围内,不要让它过大或者过小,这样调整的好处是可以降低模型的复杂度,降低过拟合的风险 用一个公式来表示的话就是 W ∣ W ∣ ≤ θ W\~\~\~\~\~\|W\|\\le\\theta W ∣W∣≤θ 但是这种方法过于的"硬"了,限制的太死,一半我们会使用另外一种更加柔和的方法 l o s s = l ( w , b ) + λ 2 ∣ ∣ ω ∣ ∣ loss=l(\\mathbf w,\\mathbf b)+\\frac {\\lambda}{2}\|\|\\omega\|\| loss=l(w,b)+2λ∣∣ω∣∣ 再loss函数里面加入 ω \\omega ω 项,就可以限制其不会变的很大,这样也就变相的限制了 ω \\omega ω 的取值不能太极端 #### 丢弃法 丢弃法的作用和权重衰退比较像,都是用来防止模型过拟合的,丢弃法(dropout)就是随机丢弃隐藏层的一些数,来达到减少模型复杂度的作用,虽然这种方法听起来比较简单,但是再实际应用中他的效果有的时候比权重衰退还要好一点。