深度学习知识总结1:主要涉及基础知识、数据与数学基础知识、线性神经网络和多层感知机

Deep Learning Summer 1: Summarize linear neural networks and multi-layer perceptron

Part 1 Basic concepts

> 监督学习

  1. 回归
  2. 分类
  3. 标记:例如标记图像内容,而不是单纯地进行分类
  4. 搜索:获取网页相关性得分PageRank
  5. 推荐:针对用户的匹配性打分,捕捉偏好
  6. 序列学习:文字序列、语音序列、视频序列等。

> 无监督学习

通常指不含“目标”的机器学习问题

  1. 聚类:和分类问题最大的不同是没有预定义的类别,只是将数据划分成相似的群组或簇。
  2. 主成分分析:高维->低维
  3. 因果关系和概率图模型:根据经验数据发现因果关系
  4. 生成对抗性网络(GAN)

> 与环境互动(离线学习和在线学习)

一种更加智能的人工智能,它不仅能够做出预测,还能主动与真实环境进行交互,并对环境产生影响。这种智能代理不仅仅是一个预测模型,而是具备了主动学习、决策和行动的能力。

> 强化学习

上述这种能够与真实环境互动的人工智能最典型一种是强化学习代理。在强化学习中,智能代理通过与环境进行交互,观察环境的状态和反馈,从而学习如何采取行动以最大化累积的奖励。强化学习代理不仅预测未来的状态,还能主动决策并对环境产生影响,具有更高的智能水平。

  • 研究领域:机器人、对话系统、AI等
  • 深度强化学习则是将深度学习应用于强化学习的问题。
  • 强化学习流程:接受观察(observation)->选择动作(action)->通过某种机制(执行器)传回环境->智能体(agent)从环境中得到奖励(reward);目标是产生一个好的策略。
  • 监督学习如何转化为强化学习,以及强化学习中的credit assignment、选择动作问题等。
  • 当环境可被完全观察到时,强化学习问题被称为马尔可夫决策过程。 当状态不依赖于之前的操作时,我们称该问题为上下文赌博机。 当没有状态,只有一组最初未知回报的可用动作时,这个问题就是经典的多臂赌博机。

> 机器学习近10年间取得巨大进步的想法

  1. 容量控制:dropout
  2. 如何在不增加可学习参数的情况下增加系统的记忆和复杂性:Attention Model
  3. 多阶段设计:存储器网络和神经编程器-解释器
  4. GAN
  5. 构建并行和分布式训练算法
  6. 并行计算能力的提升
  7. 深度学习框架

Part 2 Data Operations and Basic Mathematics

> 数据操作和预处理

  1. 常见数据操作API:https://zh-v2.d2l.ai/chapter_preliminaries/ndarray.html
  2. 对于任意具有相同形状的张量, 常见的标准算术运算符(+、-、*、/和**)都可以被升级为按元素运算。*是按位(元素)乘法、**是求幂运算。torch.exp(x)是指以e为底,x为幂的指数运算。
  3. 除了按元素计算外,我们还可以执行线性代数运算,包括向量点积和矩阵乘法。线性代数将在Basic mathematics小节中展开。
  4. 广播机制:针对不同形状张量的按元素操作。
  5. 节省内存:执行原地操作,即切片表示法,例如Y[:] = expression,而不是单纯使用Y = expression
  6. 对于csv文件,需要将数据读取为Pandas的DataFrame对象,然后需要用loc、iloc等方法进行切片。
  7. 填充缺失值:inputs = data.fillna(0);转换独热编码(将离散特征转换为二进制向量的表示方式):inputs = pd.get_dummies(data, dummy_na=True)

> 基础数学

  1. 两个矩阵的按元素乘法称为hadamard积
  2. 降维求和(axis)、非降维求和(keepdims=True)->沿轴计算累积总和且不沿任何轴降低输入张量的维度。A.cumsum(dim=0)
  3. 点积(Dot Product):向量相同位置按元素乘积的总和。torch.dot(x, y)=torch.sum(x * y)。不支持广播操作。(X.T dot Y)
  4. 矩阵-向量积:要求矩阵列数与向量长度相同,最后结果是一个向量,具有矩阵行数的长度。(在后续学习中会发现,深度学习中更多使用torch.matmul而非torch.mv,是因为前者具有可以处理更广维度的张量和使用广播机制。
  5. 矩阵乘法
  6. 范数:向量叫L2范数,矩阵叫Frobenius范数。
  7. 数值微分、偏导数、梯度、自动微分
    x.requires_grad_(True)
    y.backward() *需注意y的标量问题
    x.grad
    
  8. 非标量变量的反向传播 需要传入gradient参数;分离计算 使用detach()方法用于创建一个新的张量,其值与原始张量相同,但是它和计算图脱离关系,也就是说,它不再是一个叶子节点,不会参与反向传播。
  9. 基本概率论中使用multinomial.Multinomial(10, fair_probs).sample((500,))来进行多项式分布的数次独立实验,配合cumsum、dim实现概率观测。
  10. 用dir()和help()函数或在Jupyter记事本中使用?和??查看API的用法文档。如:torch.ones??

Part 3 linear neural networks

> 线性回归

对于特征集合X(多个样本,每个样本多个特征),和权重向量w,预测值y可以用矩阵-向量积表示。
  • 优化的目的是使损失函数的值尽可能小,而由于不是所有问题都能找到损失值关于权重w的极小值点(导数=0,数学意义上的解析解),所以优化方式是不断计算损失函数(数据集中所有样本的损失均值) 关于模型参数的导数(在这里也可以称为梯度),以便在损失函数递减的方向上更新参数来降低误差,即梯度下降法
  • 但由于需要遍历整个数据集,执行可能会非常慢,所以通常只随机抽取一小批样本,故称小批量随机梯度下降法
  • 噪声正态分布。在高斯(正态)噪声的假设下,最小化均方误差等价于对线性模型的极大似然估计,而极大似然估计则代表了假设有一个概率分布的参数向量θ,我们的目标是找到一个θ的估计值,使得给定观测数据的条件下,该估计值能够最大化观测数据出现的概率。
  • 同样的,我们依然可以用描述神经网络的方式来描述线性模型, 从而把线性模型看作一个神经网络。层、全连接层

线性回归从零手动实现到利用深度学习框架简洁实现

一. 手动实现
  1. 生成数据集:synthetic_data(w, b, num_examples)生成y=Xw+b+噪声
  2. 读取数据集:data_iter(batch_size, features, labels)生成大小为batch_size的小批量
  3. 初始化参数模型:可以通过从均值为0、标准差为0.01的正态分布中采样随机数来初始化权重w, 同时设置requires_grad=True。并将偏置b初始化为0。
  4. 定义模型:torch.matmul(X, w) + b
  5. 定义损失函数:(y_hat - y.reshape(y_hat.shape)) ** 2 / 2
  6. 定义优化算法:sgd(params, lr, batch_size)
  7. 训练:
lr = 0.03
num_epochs = 3
net = linreg
loss = squared_loss

for epoch in range(num_epochs):
    for X, y in data_iter(batch_size, features, labels):
        l = loss(net(X, w, b), y)  # X和y的小批量损失
        # 因为l形状是(batch_size,1),而不是一个标量。l中的所有元素被加到一起,
        # 并以此计算关于[w,b]的梯度
        l.sum().backward()
        sgd([w, b], lr, batch_size)  # 使用参数的梯度更新参数
    with torch.no_grad():
        train_l = loss(net(features, w, b), labels)
        print(f'epoch {epoch + 1}, loss {float(train_l.mean()):f}')
二. 简洁实现
  1. 生成数据集,与手动实现类似。
  2. 读取数据集:调用API,利用load_array可以构造一个PyTorch数据迭代器。
  3. 定义模型:对于标准深度学习模型,可以使用框架预定义好的层。这使我们只需关注使用哪些层来构造模型,而不必关注层的实现细节。net = nn.Sequential(nn.Linear(2, 1)):其中 Sequential类将多个层串联在一起(这里只有一层,但为了标准化,我们把它加上),而全连接层在Linear类中定义,传入输入特征形状和输出特征形状。
  4. 初始化参数模型:可使用weight.databias.data方法访问参数,还可以使用替换方法normal_fill_来重写参数值。
  5. 定义损失函数:loss = nn.MSELoss()
  6. 定义优化算法:trainer = torch.optim.SGD(net.parameters(), lr=0.03)
  7. 训练:对比手动中l的计算
num_epochs = 3
for epoch in range(num_epochs):
    for X, y in data_iter:
        l = loss(net(X) ,y)
        trainer.zero_grad()
        l.backward()
        trainer.step()
    l = loss(net(features), labels)
    print(f'epoch {epoch + 1}, loss {l:f}')

> Softmax回归

与回归问题相对地,机器学习也对分类问题感兴趣,不是问“多少”,而是问“哪一个”。

  1. 表示分类数据的简单方法:独热编码。
  2. 与线性回归问题的特征w不同,Softmax回归的w不是一个向量,而是一个d*q的矩阵。(其中d是特征的数量,q对应q个可能的输出类别)
  3. 要将线性层的输出视为概率,必须保证在任何数据上的输出都是非负的且总和为1,此外,需要一个训练的目标函数,来激励模型精准地估计概率。而Softmax函数能够很好地将未规范化的预测变换为非负数并且总和为1,同时让模型保持可导的性质。
  4. Softmax回归是逻辑回归,其属于分类问题而;尽管softmax是一个非线性函数,但softmax回归的输出仍然由输入特征的仿射变换决定。 因此,softmax回归是一个线性模型。
  5. 损失函数使用交叉熵损失。与线性回归模型相同,他们都是根据最大似然估计求出来的。从信息论上看,交叉熵是一个衡量两个概率分布之间差异的很好的度量,它测量给定模型编码数据所需的比特数。

Softmax回归从零手动实现到利用深度学习框架简洁实现

  • 下载数据集之后读取小批量:使用内置数据迭代器data.DataLoader
一. 手动实现
  1. 初始化参数模型:与线性回归中手动初始化一样。
  2. 定义Softmax操作:
  • 其中sum操作可以沿着张量中的特定维度工作:列是轴0,行是轴1。
    • def softmax(X)
  1. 定义模型:softmax(torch.matmul(X.reshape((-1, W.shape[0])), W) + b),其中reshape函数是为了将X展平为向量。
  2. 定义损失函数:交叉熵采用真实标签的预测概率的负对数似然。return - torch.log(y_hat[range(len(y_hat)), y]);其中y代表了真实的标签,而y_hat则包含了对样本的预测结果的概率。
  3. 分类精度:(相比于线性模型,分类问题更需要分类精度来说明其模型的性能)正确预测数量和总预测数量之比,直接优化精度很困难,因为精度计算不可导。对于任意数据迭代器data_iter可访问的数据集,可以评估在任意模型net的精度。evaluate_accuracy(net,data_iter)
  4. 训练(包含定义优化算法):重构训练过程以便可以重复使用:
lr = 0.1

def updater(batch_size):
    return d2l.sgd([W, b], lr, batch_size)


def train_epoch_ch3(net, train_iter, loss, updater):  #@save
    """训练模型一个迭代周期(定义见第3章)"""
    # 将模型设置为训练模式
    if isinstance(net, torch.nn.Module):
        net.train()
    # 训练损失总和、训练准确度总和、样本数
    metric = Accumulator(3)
    for X, y in train_iter:
        # 计算梯度并更新参数
        y_hat = net(X)
        l = loss(y_hat, y)
        if isinstance(updater, torch.optim.Optimizer):
            # 使用PyTorch内置的优化器和损失函数
            updater.zero_grad()
            l.mean().backward()
            updater.step()
        else:
            # 使用定制的优化器和损失函数
            l.sum().backward()
            updater(X.shape[0])
        metric.add(float(l.sum()), accuracy(y_hat, y), y.numel())
    # 返回训练损失和训练精度
    return metric[0] / metric[2], metric[1] / metric[2]
def train_ch3(net, train_iter, test_iter, loss, num_epochs, updater):  #@save
    """训练模型(定义见第3章)"""
    animator = Animator(xlabel='epoch', xlim=[1, num_epochs], ylim=[0.3, 0.9],
                        legend=['train loss', 'train acc', 'test acc'])
    for epoch in range(num_epochs):
        train_metrics = train_epoch_ch3(net, train_iter, loss, updater)
        test_acc = evaluate_accuracy(net, test_iter)
        animator.add(epoch + 1, train_metrics + (test_acc,))
    train_loss, train_acc = train_metrics
    assert train_loss < 0.5, train_loss
    assert train_acc <= 1 and train_acc > 0.7, train_acc
    assert test_acc <= 1 and test_acc > 0.7, test_acc
  1. 预测
二. 简洁实现
  1. 初始化参数模型:通过nn.Sequential的方式构建net
  2. 定义Softmax操作和模型:在手动实现中,从计算角度上来看,Softmax操作中的指数计算可能会造成数值的稳定性问题。所以在实际的问题解决中,我们会在计算交叉熵损失的时候,最终取结果的对数。通过将softmax和交叉熵结合在一起,可以避免反向传播过程中可能会困扰我们的数值稳定性问题。具体而言,在交叉熵损失函数中我们传递未规范化的预测,同时计算softmax及其对数。
    loss = nn.CrossEntropyLoss(reduction='none')
  3. 定义优化算法:trainer = torch.optim.SGD(net.parameters(), lr=0.1)
  4. 训练

Part 4 Multi-layer perceptron

> 为什么需要非线性模型?

  • 线性意味着单调,但不是所有的模型输出都随着特征的值单调递增/递减。我们可以通过对数据进行预处理而将其转换为线性相关的模型。
  • 但诸如图像分类,增加某处像素的强度是否总是增加(或降低)图像描绘“狗”的似然?我们难以通过简单的预处理来解决这个问题,这是因为任何像素的重要性都以复杂的方式取决于该像素的上下文(周围像素的值)。我们可能需要一种更复杂的数据表示方法,以考虑特征之间的相关交互作用。然而,手动设计这种复杂表示方法可能是困难的,因为我们不知道如何准确地计算这种表示。
  • 所以对于深度神经网络,我们使用观测数据来联合学习隐藏层表示和应用于该表示的线性预测器。深度神经网络可以从观测数据中学习隐藏层的表示,这种表示可以考虑到特征之间的相关关系。然后,在此表示的基础上建立线性预测器,进一步优化模型的性能。这样,深度神经网络可以自动学习复杂的特征表示,从而更好地解决复杂问题。

> 多层感知机MLP

  • MLP是全连接层的堆叠,可以把前L-1层看作表示,最后一层看成线性预测器。但具有全连接层的多层感知机的参数开销可能会高得令人望而却步。 即使在不改变输入或输出大小的情况下, 可能在参数节约和模型有效性之间进行权衡。
  • 一个隐藏层的输出称为隐藏表示,添加隐藏层后模型需要跟踪和更新额外的参数。但如果单纯这么做,模型仍然是仿射函数的变换,最终都可以退化为线性模型,这样就失去了想要模型表示更多特征之间的相关关系的目的了。
  • 所以,我们需要再仿射变换之后对每个隐藏单元应用非线性的激活函数。常见的激活函数:ReLU、Sigmoid、tanh
    • 其中ReLU使用地最广泛,它也减轻了梯度消失问题。
    • 当我们想要将输出视作二元分类问题的概率时, sigmoid仍然被广泛用作输出单元上的激活函数 (sigmoid可以视为softmax的特例)。但在隐藏层中已经很少使用。
    • tanh将输出压缩转换到区间[-1,1]上, 函数的形状类似于sigmoid函数, 不同的是tanh函数关于坐标系原点中心对称。

多层感知机从零手动实现到利用深度学习框架简洁实现

一. 手动实现

通常,我们选择2的若干次幂作为层的宽度。 因为内存在硬件中的分配和寻址方式,这么做往往可以在计算上更高效。

  1. 初始化参数模型:nn.Parameter是一个特殊的张量类型,它是用于定义模型参数的一种方法。当我们在神经网络模型中定义一个nn.Parameter对象时,PyTorch会自动将其注册为模型的可学习参数,即可以在训练过程中自动更新其值以优化模型的性能。
  2. 定义激活函数:def relu(X): a = torch.zeros_like(X) return torch.max(X, a)
  3. 定义模型:return (H@W2 + b2),其中@代表矩阵乘法。
  4. 定义损失函数:交叉熵损失loss = nn.CrossEntropyLoss(reduction='none')同softmax实现中一样,我们通过同时计算softmax和交叉熵,避免了数据上的上溢和下溢问题。
  5. 训练

手动实现一个简单的多层感知机是很容易的。然而如果有大量的层,从零开始实现多层感知机会变得很麻烦(例如,要命名和记录模型的参数)

二. 简洁实现
  1. 定义模型:
net = nn.Sequential(nn.Flatten(),
                    nn.Linear(784, 256),
                    nn.ReLU(),
                    nn.Linear(256, 10))

def init_weights(m):
    if type(m) == nn.Linear:
        nn.init.normal_(m.weight, std=0.01)

net.apply(init_weights);
  1. 训练:模块化设计
batch_size, lr, num_epochs = 256, 0.1, 10
loss = nn.CrossEntropyLoss(reduction='none')
trainer = torch.optim.SGD(net.parameters(), lr=lr)

train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)

对于相同的分类问题,多层感知机的实现与softmax回归的实现相同,只是多层感知机的实现里增加了带有激活函数的隐藏层。

所以相同地,虽然Softmax都没有在模型定义的时候显地出现,但实际上在PyTorch中,Softmax函数被内置在交叉熵损失函数nn.CrossEntropyLoss中。这是因为在训练分类模型时,通常将Softmax和交叉熵损失函数一起使用。(如Softmax探讨交叉熵时所示)

> 模型选择与拟合问题

  1. 训练误差和泛化误差,泛化误差涉及独立同分布假设
  2. 过拟合是指,将模型在训练数据上拟合的比在潜在分布中更接近的现象,他会导致不能对看不见的数据做到很好的泛化。 用于对抗过拟合的技术称为正则化,深度学习中有许多启发式的技术旨在防止过拟合。注意欠拟合和过拟合的概念和产生因素以及在实际生产过程中的影响。
  3. 影响模型泛化的重要因素:
    • 可调整的参数量。当可调整参数的数量(有时称为自由度)很大时,模型往往更容易过拟合。
    • 参数采用的值。当权重的取值范围较大时,模型可能更容易过拟合。
    • 训练样本的数量。训练样本越少,越容易发生过拟合。总的来说,增加样本数量是一种有效的方法来改善模型的性能,减少过拟合和欠拟合问题。然而,增加样本数量也可能带来计算成本和数据采集成本的增加,因此在实际应用中需要综合考虑。如果样本数量较少,可以尝试使用数据增强技术来扩充数据集,或者采用更复杂的模型来提高模型的学习能力。如果样本数量充足,可以尝试简化模型结构或引入正则化等方法来防止过拟合。
  4. 如何进行模型的选择:一类是比较本质不同的几种模型;另一个是比较不同超参数设置下的同一类模型。此时我们需要增加验证集来帮助我们选择最佳模型。即训练集用于训练模型的参数,验证集用于监控模型的性能和选择超参数,测试集用于最终评估模型的泛化能力。对于没有足够数据的问题,可以采用K折交叉验证来解决。应该选择一个复杂度适当的模型,避免使用数量不足的训练样本,而造成过拟合问题。
  5. 处理过拟合的典型方法(正则化模型技术):权重衰减和暂退法(Dropout)
  6. 权重衰减:将原来的训练目标最小化训练标签上的预测损失,调整为最小化预测损失和惩罚项之和。惩罚项使用平方L2范数(而非标准范数,使得惩罚的导数很容易计算),同时引入正则化常数$\lambda $来对惩罚项进行权衡。这样可以对权重向量的大分量施加了巨大的惩罚,使得我们的学习算法偏向于在大量特征上均匀分布权重的模型,这也是为什么被称作权重衰减。L1惩罚则更适用于特征选择。
    • 权重衰减的简洁实现:在优化函数(如sgd中)指定weight_decay超参数。
  7. 上述线性模型泛化的可靠性是有代价的。 简单地说,线性模型没有考虑到特征之间的交互作用。 对于每个特征,线性模型必须指定正的或负的权重,而忽略其他特征。泛化性和灵活性之间的这种基本权衡被描述为偏差-方差权衡。线性模型和深度神经网络位于权衡的两端。
  8. Dropout更倾向于改进深层网络的泛化性。
    • 简单模型能缩小训练和测试之间的差距,同时能带来平滑性(即函数太会对输入的微小变化敏感)。
    • 在训练过程中,建议在计算后续层之前向网络的每一层注入噪声。 因为当训练一个有多层的深层网络时,注入噪声只会在输入-输出映射上增强平滑性。这个想法被称为暂退法Dropout。
    • 如何注入这种噪声:一种想法是以一种无偏向(unbiased)的方式注入噪声。来保持每一层的期望值等于没有噪音时的值。
    • 在训练过程中,暂退法通过随机地将神经网络中的一些神经元临时设置为零(也称为暂时关闭或丢弃),来降低神经网络的复杂性。具体来说,在每次训练迭代中,暂退法以概率p(通常是一个小的值,如0.2或0.5)随机选择一些神经元,然后将它们的输出设置为零。这样做的效果是,网络在训练过程中变得不那么依赖于某些特定的神经元,从而增加了模型的鲁棒性。
    • 当进行推理(测试)时,暂退法不起作用,所有神经元都保持激活状态。这是因为在推理阶段我们希望使用完整的网络来进行预测,而不是随机地丢弃部分神经元。
    • 简洁实现:我们只需在每个全连接层之后添加一个Dropout层, 将暂退概率作为唯一的参数传递给它的构造函数。 在训练时,Dropout层将根据指定的暂退概率随机丢弃上一层的输出(相当于下一层的输入)。 在测试时,Dropout层仅传递数据。

> 计算图、数值稳定性和分布偏移

  1. 反向传播的目的是计算损失关于参数的梯度。即 ∂ J / ∂ W ( i ) \partial J/\partial W^{(i)} J/W(i)。反向传播重复利用前向传播中存储的中间值,以避免重复运算。
  2. 如何初始化模型参数在神经网络学习中有着举足轻重的作用,它对保持数值稳定性至关重要。糟糕选择可能会导致我们在训练时遇到梯度爆炸或梯度消失。
  3. 梯度爆炸:参数更新过大,破坏了模型的稳定收敛;梯度消失:参数更新过小,在每次更新时几乎不会移动,导致模型无法学习( Sigmoid函数会导致梯度消失,其导数性质决定了)。根据退化转换,输出 o o o关于任何一组参数 W ( l ) W^{(l)} W(l)的梯度是 L − l L-l Ll个矩阵与梯度向量的乘积,所以需要避免由于概率矩阵相乘过多之后的梯度消失和方差过大的矩阵相乘带来的梯度爆炸。为了解决这些问题,有一些常见的方法可以采取:
    • 使用合适的激活函数
    • 使用参数初始化方法:合适的参数初始化可以帮助避免梯度爆炸问题,如Xavier/Glorot初始化、He初始化等。
    • 使用批量归一化:批量归一化可以通过归一化输入数据来加速训练过程,并且有助于防止梯度消失和梯度爆炸问题。
    • 使用梯度裁剪:梯度裁剪可以限制梯度的大小,防止梯度爆炸问题。
  4. 在神经网络设计中,存在参数的对称性问题。这种对称性是指对于某些隐藏层或输出层的权重,通过重排列这些权重,我们可以得到等价的模型,即模型的预测结果保持不变。它会导致(1)过度拟合(2)学习效率底下等问题。可采取权重共享、正则化、参数化约束、数据增强等方法进行解决。
  5. 下面介绍参数初始化来解决梯度的消失爆炸、参数对称性和数值稳定性的问题。
    • 对于一般的问题,可以使用框架中的默认初始化。
    • Xavier初始化(启发式算法):基于统计学的初始化方法,根据每一层输入和输出的维度来设置权重的初始值。对于某一层的权重矩阵W,假设它的输入维度为n_in,输出维度为n_out,则Xavier初始化将权重的初始值设置为从均值为0、方差为2/(n_in + n_out)的正态分布中随机采样。在实际应用中,Xavier初始化通常应用于全连接层和卷积层的权重参数初始化。在PyTorch中,可以通过torch.nn.init.xavier_normal_torch.nn.init.xavier_uniform_等函数来实现Xavier初始化。
    • 深度学习框架通常实现十几种不同的启发式方法来实现参数的初始化。研究热点
  6. 分布偏移指训练集和测试集并不来自同一个分布。类型及纠正:协变量偏移、标签偏移、概念偏移。可以在测试时检测并纠正协变量偏移和标签偏移。经验风险最小化
  7. 学习问题的分类法(与环境相关):
    • 批量学习(离线)
    • 在线学习
    • 老虎机:在线学习的一个特例,即根据奖励或损失,能采取的行动是有限的。它是一个更简单的问题,但可以获得更强的最优化理论保证。
    • 控制:与环境交互,控制理论(如PID变体)也被用于自动调整超参数。是一种基于规则和数学模型的控制方法。
    • 强化学习:强调如何基于环境而行动,以取得最大化的预期利益。是一种基于学习和奖励的控制方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值