Skip to content

Deep Learning

字数
1851 字
阅读时间
8 分钟

概率论

极大似然估计

概率是通过已知的条件,推测事件发生的可能性;似然则相反,是基于已经确定的结果反推产生这个结果的可能性。

θxP(x|θ)PxL(θ|x)Lθ

极大(最大)似然估计:通过已知结果推测最大概率导致这些样本结果出现的模型参数。

2.4 Calculus

梯度

我们可以连结一个多元函数对其所有变量的偏导数,以得到该函数的梯度(gradient)向量。 具体而言,设函数f:RnR的输入是一个n维向量x=[x1,x2,,xn],并且输出是一个标量。 函数f(x)相对于x的梯度是一个包含n个偏导数的向量:

xf(x)=[f(x)x1,f(x)x2,,f(x)xn],

其中$ \nabla_{\mathbf{x}} f(\mathbf{x}) \nabla f(\mathbf{x})$取代。

假设xn维向量,在微分多元函数时经常使用以下规则:

  • 对于所有ARm×n,都有xAx=A
  • 对于所有ARn×m,都有xxA=A
  • 对于所有ARn×n,都有xxAx=(A+A)x
  • xx2=xxx=2x

同样,对于任何矩阵X,都有XXF2=2X​。 正如我们之后将看到的,梯度对于设计深度学习中的优化算法有很大用处。

关于梯度向量是行向量还是列向量?

都不是,行向量和列向量是从矩阵的角度来描述向量时才特有的,普通向量并没有必须放到矩阵中去,也没有所谓必须是行向量或者列向量的说法

练习

绘制函数y=f(x)=x31x和其在x=1​处切线的图像。

python
import numpy as np
import matplotlib.pyplot as plt

def func(x):
    return x ** 3 - 1 / x
def numerical_lim(f,x):
    h = 1e-4
    return (f(x+h)-f(x))/h
def tangent_line(f, x):
    ## d就是调用numerical_diff求得在x点点导数
    d = numerical_lim(f, x)
    ## 这里直接y=kx+b求截,简单粗暴,y就是截距
    y = f(x) - d * x
    ## 使用lambda匿名函数,t是形参,':'后是要执行的函数表达式
    return lambda t: d * t + y

x = np.arange(0.1, 5, 0.1)
y = func(x)

plt.xlabel('x')
plt.ylabel('y')
## 把函数作为形参时i,传入实参函数时,只要函数名即可,不用()
tf = tangent_line(func,1)
## 因为tf返回的是lambda函数,所以要多调一次函数
y2 = tf(x)
plt.plot(x, y)
plt.plot(x, y2, linestyle='--')
plt.show()

求函数f(x)=3x12+5ex2​的梯度。

[6x1,5ex2]

函数f(x)=x2​的梯度是什么?

||x||2=i=1nxi2=x12+x22+xn2D(||x||2)=12i=1nxi2D(i=1nxi2)=xii=1nxi2x||x||2=[x1i=1nxi2xni=1nxi2]

尝试写出函数u=f(x,y,z),其中x=x(a,b)y=y(a,b)z=z(a,b)的链式法则。

ua=fxxa+fyya+fzzaub=fxxb+fyyb+fzzb

2.5 Automatic Differentiation

[5分钟深度学习] ##02 反向传播算法

在PyTorch中,.requires_grad_(True) 是一个用于设置张量(tensor)属性的方法,用于指示计算时是否需要计算梯度(gradient)。具体来说:

  • x.requires_grad_(True) 表示将张量 xrequires_grad 属性设置为 True,这意味着当对 x 进行操作时,PyTorch会自动跟踪对 x 的计算,并且在计算过程中保留梯度信息,以便后续进行反向传播计算梯度。

通常情况下,我们会将需要参与模型训练的参数设置为 requires_grad=True,以便在优化过程中自动计算参数的梯度,从而更新参数。

举例说明:

python
import torch

## 创建一个张量
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=False)

## 设置 requires_grad=True,即需要计算梯度
x.requires_grad_(True)

## 进行一些计算
y = x.pow(2).sum()

## 反向传播,计算梯度
y.backward()

## 输出梯度
print(x.grad)  ## 这里将会输出对应的梯度值

在这个例子中,我们将 xrequires_grad 属性设置为 True,然后进行了一些计算(计算了 x 的平方和 y),然后通过 y.backward() 反向传播计算了 yx 的梯度。 image-20240411201507888

2.7 Documentation

为了知道模块中可以调用哪些函数和类:

  • 查找模块的所有属性
python
dir(torch.distributions)

通常可以忽略以“__”(双下划线)开始和结束的函数,它们是Python中的特殊对象, 或以单个“_”(单下划线)开始的函数,它们通常是内部函数。 根据剩余的函数名或属性名,我们可能会猜测这个模块提供了各种生成随机数的方法, 包括从均匀分布(uniform)、正态分布(normal)和多项分布(multinomial)中采样。

  • 查找特定函数和类的用法

有关如何使用给定函数或类的更具体说明,可以调用help函数。 例如,我们来查看张量ones函数的用法。

python
help(torch.ones)

3. 线性神经网络

3.1 线性回归

给定一个数据集,我们的目标是寻找模型的权重w和偏置b​, 使得根据模型做出的预测大体符合数据里的真实价格。 输出的预测值由输入特征通过线性模型的仿射变换决定,仿射变换由所选权重和偏置确定。

image-20240415151504433

3.4 softmax回归

softmax回归是一个多类分类问题

image-20240428101910628

计算过程

image-20240428103109002

image-20240428103203942

所有输出o,都转化为y,且

y1+y2+...+yn=1y1,y2,...,yn[0,1]

image-20240428103528482

  • 独热编码

顾名思义,全连接层是“完全”连接的,可能有很多可学习的参数。 具体来说,对于任何具有𝑑个输入和𝑞个输出的全连接层, 参数开销为𝑂(𝑑𝑞),这个数字在实践中可能高得令人望而却步。 幸运的是,将𝑑个输入转换为𝑞个输出的成本可以减少到𝑂(𝑑𝑞/𝑛), 其中超参数𝑛可以由我们灵活指定,以在实际应用中平衡参数节约和模型有效性 (Zhang et al., 2021)。

损失函数

l2 loss
l(y,y)=12(yy)2
l1 loss
l(y,y)=|yy|
Huber's Robust Loss
l(y,y)={|yy|12if|yy|>112(yy)2otherwise

书籍

机器学习、NLP面试中常考到的知识点和代码实现

动手学深度学习

最全西瓜书-周志华《机器学习》笔记

论文

颠覆传统!Transformer时序预测重大突破

贡献者

The avatar of contributor named as Yiming Li Yiming Li

文件历史

撰写