图神经网络有哪些常用的优化算法和损失函数

问题背景

图神经网络(Graph Neural Network, GNN)是一类用于处理图数据的深度学习模型。与传统的神经网络不同,GNN可以有效地对节点和图之间的结构信息进行建模,适用于社交网络分析、化学分子分析、推荐系统等领域。

本文将详细介绍一些常用的优化算法和损失函数,以提升图神经网络的性能。

优化算法

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

随机梯度下降法是最基本的优化算法之一,被广泛应用于深度学习领域。它通过迭代更新模型参数来最小化损失函数。

算法原理:
1. 初始化模型参数。
2. 从训练数据中随机选择一个样本(或一批样本)。
3. 根据当前参数进行前向传播计算,得到模型输出。
4. 计算损失函数对参数的梯度。
5. 根据梯度和学习率更新参数。
6. 重复步骤2-5,直到达到停止条件。

公式推导:

假设损失函数为$$L$$,模型参数为$$\theta$$,学习率为$$\alpha$$。

对于一个样本$$x$$,模型输出为$$y$$。

损失函数对参数的梯度为$$\frac{\partial L}{\partial \theta}$$。

参数的更新公式为$$\theta \leftarrow \theta – \alpha \cdot \frac{\partial L}{\partial \theta}$$。

计算步骤:
1. 初始化模型参数$$\theta$$。
2. for each epoch:
– for each mini-batch:
– 计算模型输出$$y$$。
– 计算损失函数$$L$$。
– 计算参数梯度$$\frac{\partial L}{\partial \theta}$$。
– 更新参数$$\theta \leftarrow \theta – \alpha \cdot \frac{\partial L}{\partial \theta}$$。

复杂Python代码示例:

import numpy as np

# 初始化模型参数
theta = np.random.randn(100, 1)

# 迭代更新参数
for epoch in range(num_epochs):
 for batch in range(num_batches):
 # 从训练数据中随机选择一个样本
 x, y = get_random_sample()

 # 前向传播计算模型输出
 y_pred = forward(x, theta)

 # 计算损失函数
 loss = compute_loss(y, y_pred)

 # 计算参数梯度
 grad = compute_gradient(x, y, theta)

 # 更新参数
 theta = theta - learning_rate artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls grad

代码细节解释:
– 初始化模型参数:使用np.random.randn()函数生成服从正态分布的随机数作为初始参数。
– 迭代更新参数:通过嵌套的循环,遍历数据集中的样本,并进行模型前向计算、损失计算、梯度计算和参数更新。
– get_random_sample():自定义函数,用于从训练数据中随机选择一个样本。
– forward():自定义函数,用于进行前向传播计算,将输入数据和当前参数作为输入,返回模型输出。
– compute_loss():自定义函数,用于计算损失函数,将真实标签和模型输出作为输入,返回损失值。
– compute_gradient():自定义函数,用于计算参数梯度,将输入数据、真实标签和当前参数作为输入,返回梯度值。

2. Adam优化算法

Adam(Adaptive Moment Estimation)优化算法是一种自适应学习率的优化算法,可以自动调整学习率,适应不同参数的更新情况。

算法原理:
1. 初始化模型参数和一阶矩估计$$m$$、二阶矩估计$$v$$。
2. for each iteration:
– 计算梯度$$g$$。
– 更新一阶矩和二阶矩估计:
– $$m \leftarrow \beta_1 \cdot m + (1-\beta_1) \cdot g$$
– $$v \leftarrow \beta_2 \cdot v + (1-\beta_2) \cdot g^2$$
– 校正一阶和二阶矩的偏差:
– $$\hat{m} \leftarrow \frac{m}{1-\beta_1^t}$$
– $$\hat{v} \leftarrow \frac{v}{1-\beta_2^t}$$
– 更新参数:
– $$\theta \leftarrow \theta – \alpha \cdot \frac{\hat{m}}{\sqrt{\hat{v}} + \epsilon}$$

公式推导:

$$m$$为梯度的一阶矩估计,$$v$$为梯度的二阶矩估计。$$\beta_1$$和$$\beta_2$$是衰减率,$$t$$表示当前迭代的次数。

参数的更新公式为$$\theta \leftarrow \theta – \alpha \cdot \frac{\hat{m}}{\sqrt{\hat{v}} + \epsilon}$$,其中$$\hat{m}$$和$$\hat{v}$$为校正一阶和二阶矩的偏差。

计算步骤:
1. 初始化模型参数$$\theta$$和一阶矩估计$$m$$、二阶矩估计$$v$$。
2. for each iteration:
– 计算梯度$$g$$。
– 更新一阶和二阶矩估计:
– $$m \leftarrow \beta_1 \cdot m + (1-\beta_1) \cdot g$$
– $$v \leftarrow \beta_2 \cdot v + (1-\beta_2) \cdot g^2$$
– 校正一阶和二阶矩的偏差:
– $$\hat{m} \leftarrow \frac{m}{1-\beta_1^t}$$
– $$\hat{v} \leftarrow \frac{v}{1-\beta_2^t}$$
– 更新参数$$\theta \leftarrow \theta – \alpha \cdot \frac{\hat{m}}{\sqrt{\hat{v}} + \epsilon}$$

复杂Python代码示例(以一个简化的示例为例):

import numpy as np

# 初始化模型参数
theta = np.random.randn(100, 1)
m = np.zeros_like(theta)
v = np.zeros_like(theta)
beta1 = 0.9
beta2 = 0.999
epsilon = 1e-8

# 迭代更新参数
for epoch in range(num_epochs):
 for batch in range(num_batches):
 # 从训练数据中随机选择一个样本
 x, y = get_random_sample()

 # 计算梯度
 grad = compute_gradient(x, y, theta)

 # 更新一阶和二阶矩估计
 m = beta1 artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls m + (1 - beta1) artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls grad
 v = beta2 artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls v + (1 - beta2) artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls grad artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls 2

 # 校正一阶和二阶矩的偏差
 m_hat = m / (1 - beta1 artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls t)
 v_hat = v / (1 - beta2 artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls t)

 # 更新参数
 theta = theta - learning_rate artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls m_hat / (np.sqrt(v_hat) + epsilon)

代码细节解释:
– 初始化模型参数:使用np.random.randn()函数生成服从正态分布的随机数作为初始参数,同时初始化一阶和二阶矩估计为零向量。
– 迭代更新参数:通过嵌套的循环,遍历数据集中的样本,并进行梯度计算、一阶和二阶矩估计更新、偏差校正和参数更新。
– compute_gradient():自定义函数,用于计算梯度,将输入数据、真实标签和当前参数作为输入,返回梯度值。

损失函数

常用的图神经网络损失函数有均方误差损失(Mean Squared Error, MSE)和交叉熵损失(Cross Entropy Loss)。

1. 均方误差损失(Mean Squared Error, MSE)

均方误差损失是一种常用的回归问题损失函数,适用于预测连续变量的任务。它计算目标值与预测值之间的差异的平方和。

公式推导:

假设$$y$$为真实标签,$$\hat{y}$$为模型预测值。

损失函数为$$L(\theta) = \frac{1}{n} \sum_{i=1}^{n} (y_i – \hat{y_i})^2$$,其中$$n$$为样本数量。

计算步骤:
1. 计算预测值$$\hat{y}$$。
2. 计算损失值$$L(\theta) = \frac{1}{n} \sum_{i=1}^{n} (y_i – \hat{y_i})^2$$。

2. 交叉熵损失(Cross Entropy Loss)

交叉熵损失是一种常用的分类问题损失函数,适用于预测离散变量的任务。它计算目标分类标签和预测概率之间的交叉熵。

公式推导:

假设$$y$$为真实标签的one-hot编码,$$\hat{y}$$为模型预测的概率分布。

损失函数为$$L(\theta) = -\frac{1}{n} \sum_{i=1}^{n} \sum_{j=1}^{C} y_{ij} \log(\hat{y_{ij}})$$,其中$$C$$为类别数量。

计算步骤:
1. 计算预测的概率分布$$\hat{y}$$。
2. 计算损失值$$L(\theta) = -\frac{1}{n} \sum_{i=1}^{n} \sum_{j=1}^{C} y_{ij} \log(\hat{y_{ij}})$$。

注:对于二分类问题,交叉熵损失可以简化为二元交叉熵损失(Binary Cross Entropy Loss)。

总结

本文详细介绍了图神经网络中常用的优化算法(随机梯度下降法和Adam优化算法)和损失函数(均方误差损失和交叉熵损失),包括算法原理、公式推导、计算步骤、复杂的Python代码示例和代码细节解释。这些优化算法和损失函数能够有效提升图神经网络的性能,使其适用于各种图数据分析任务。

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/824287/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球