前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >腾讯二面,差一点。。。

腾讯二面,差一点。。。

作者头像
Python编程爱好者
发布2024-06-04 19:18:52
1640
发布2024-06-04 19:18:52
举报
Hi,我是Johngo~

这几天,社群有位同学在基础机器学习算法岗工作了两年后,想要跳槽。最近面试了大概有20天左右时间了。

先后拿到了一些小厂的offer,以及小红书和商汤的offer。由于自己有着大厂梦,所以前面的offer一直拖着,等着BAT、TMD、字节等等的面试,看看最后的结果。

聊了很多,今天分享一个面试问题吧,这也是差一点就顺利拿下腾讯offer的一个问题,总感觉没有回答全面,不过最后结果还没有确定。

问题还是比较简单,可能还是没有准备充足~

问题是:你是否了解哪些常用的优化算法?它们之间有什么区别?

下面,咱们也简单来说说,提供一个思路,供大家学习~

首先来说,常用的优化算法包括:

  • 梯度下降(Gradient Descent)
  • 随机梯度下降(Stochastic Gradient Descent,SGD)
  • 动量法(Momentum)
  • AdaGrad
  • RMSProp
  • Adam
  • ...

就把这些常见的优化,进行一个简单的介绍~

1. 梯度下降(Gradient Descent)

  • 基本介绍: 梯度下降是一种基本的优化算法,用于最小化损失函数。
  • 基本原理: 通过沿着损失函数的负梯度方向更新参数,逐步接近最优解。
  • 核心公式: 参数更新规则:
\theta_{t+1} = \theta_t - \alpha \cdot \nabla J(\theta_t)
  • 推导: 由损失函数对参数的偏导数方向(梯度)决定参数更新方向,使得损失函数逐步减小。
  • 优缺点:
    • 优点:简单易懂,容易实现。
    • 缺点:可能陷入局部最优解,对初始值敏感,学习率需要调整。
  • 适用场景: 适用于凸函数的优化,参数较少的情况。

2. 随机梯度下降(Stochastic Gradient Descent,SGD)

  • 基本介绍: 随机梯度下降是梯度下降的一种变体,每次更新参数时只考虑一个样本的损失。
  • 基本原理: 通过随机抽样的方式近似计算损失函数的梯度,实现参数更新。
  • 核心公式: 参数更新规则:
\theta_{t+1} = \theta_t - \alpha \cdot \nabla J_i(\theta_t)
  • 推导: 损失函数的梯度由当前样本的梯度决定,更新参数时只考虑当前样本。
  • 优缺点:
    • 优点:计算速度快,可以处理大规模数据集。
    • 缺点:噪声较大,收敛速度慢,不稳定。
  • 适用场景: 大规模数据集、在线学习。

3. 动量法(Momentum)

  • 基本介绍: 动量法是在梯度下降的基础上引入动量项,加速参数更新。
  • 基本原理: 通过考虑历史梯度信息,累积更新方向,减小梯度方差,提高稳定性。
  • 核心公式: 参数更新规则:
v_{t+1} = \beta \cdot v_t + (1 - \beta) \cdot \nabla J(\theta_t), \quad \theta_{t+1} = \theta_t - \alpha \cdot v_{t+1}
  • 推导: 动量项由历史梯度信息累积而来,更新参数时考虑动量方向。
  • 优缺点:
    • 优点:减小震荡,加速收敛,增强参数更新方向一致性。
    • 缺点:需要调整动量参数,可能在平原上跳过最优点。
  • 适用场景: 稳定收敛、避免震荡的情况。

4. AdaGrad(Adaptive Gradient Algorithm)

  • 基本介绍: AdaGrad是一种自适应学习率的优化算法,用于解决梯度下降算法中学习率难以选择的问题。
  • 基本原理: AdaGrad的核心思想是根据参数的历史梯度调整学习率,对于频繁出现的参数梯度较大的方向,降低学习率;对于不频繁出现的参数梯度较小的方向,增加学习率。
  • 核心公式: 参数更新规则:
\theta_{t+1,i} = \theta_{t,i} - \frac{\alpha}{\sqrt{G_{t,ii} + \epsilon}} \cdot g_{t,i}
  • 推导: AdaGrad根据参数梯度的平方和为每个参数计算不同的学习率,从而实现自适应学习率的更新。
  • 优缺点:
    • 优点:自适应学习率,适用于稀疏数据、非平稳目标和非凸问题。
    • 缺点:学习率持续衰减,可能过早结束训练,不适用于深度神经网络训练。
  • 适用场景: 稀疏数据、非平稳目标、非凸问题。

5. RMSProp(Root Mean Square Propagation)

  • 基本介绍: RMSProp是一种解决AdaGrad学习率持续衰减问题的改进算法,通过指数加权移动平均的方式调整学习率。
  • 基本原理: RMSProp利用指数加权移动平均的方法对历史梯度平方的信息进行更新,从而减小学习率的衰减速度。
  • 核心公式: 参数更新规则:
\theta_{t+1,i} = \theta_{t,i} - \frac{\alpha}{\sqrt{E[g^2]_t + \epsilon}} \cdot g_{t,i}
  • 推导: RMSProp采用指数加权移动平均的方法对历史梯度平方进行更新,使得学习率的调整更加平滑。
  • 优缺点:
    • 优点:解决了AdaGrad学习率持续衰减的问题,适用于非凸函数优化。
    • 缺点:需要调整超参数,可能受初始学习率影响。
  • 适用场景: 非凸函数优化、深度学习训练。

6. Adam(Adaptive Moment Estimation)

  • 基本介绍: Adam是一种结合了动量法和RMSProp的优化算法,综合考虑梯度的一阶矩估计和二阶矩估计。
  • 基本原理: Adam通过动量项和RMSProp的指数加权移动平均对梯度进行调整,实现自适应学习率的优化。
  • 核心公式: 参数更新规则:
\theta_{t+1,i} = \theta_{t,i} - \frac{\alpha}{\sqrt{\hat{v}_t} + \epsilon} \cdot \hat{m}_t
  • 推导: Adam综合考虑了梯度的一阶矩估计和二阶矩估计,同时利用动量项和RMSProp的特性进行参数更新。
  • 优缺点:
    • 优点:综合了动量法和RMSProp的优点,适用于大规模数据和高维参数的优化。
    • 缺点:需要调整多个超参数,可能对初始学习率和动量参数敏感。
  • 适用场景: 大规模数据、高维参数优化、深度学习训练。

一个案例

代码语言:javascript
复制
# 以MNIST手写数字识别数据集为例,使用Adam优化算法训练神经网络

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt

# 数据预处理
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)

# 神经网络模型定义
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(28 * 28, 512)
        self.fc2 = nn.Linear(512, 10)
        self.relu = nn.ReLU()

    def forward(self, x):
        x = x.view(-1, 28 * 28)
        x = self.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# 初始化模型、损失函数和优化器
net = Net()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(net.parameters(), lr=0.001)  # 使用Adam优化器

# 训练模型
epochs = 10
losses = []
for epoch in range(epochs):
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data
        optimizer.zero_grad()
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
    losses.append(running_loss / len(trainloader))
    print(f"Epoch {epoch+1}, Loss: {running_loss / len(trainloader)}")

# 绘制损失曲线
plt.plot(range(epochs), losses)
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.title('Trainin    g Loss Curve')
plt.show()

代码中,使用PyTorch框架训练一个简单的神经网络模型,并使用Adam优化算法进行参数优化。数据集选择了MNIST手写数字识别,训练过程中损失曲线会有一定复杂度。

好了,我是Johngo~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Johngo学长 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 梯度下降(Gradient Descent)
  • 2. 随机梯度下降(Stochastic Gradient Descent,SGD)
  • 3. 动量法(Momentum)
  • 4. AdaGrad(Adaptive Gradient Algorithm)
  • 5. RMSProp(Root Mean Square Propagation)
  • 6. Adam(Adaptive Moment Estimation)
  • 一个案例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档