附录A:数学与算法基础
知识图谱与AI融合应用涉及多个数学和算法领域,包括图论、机器学习、深度学习等。本附录将介绍这些领域的核心概念和基础算法,为读者提供必要的数学和算法背景知识。
A.1 图论基础
A.1.1 图的基本概念
图是由节点(顶点)和边组成的数据结构,用于表示实体之间的关系。在知识图谱中,图是核心的数据表示形式。
A.1.1.1 图的定义
- 图(Graph):记为 G = (V, E) ,其中 V 是节点集合, E 是边集合
- 节点(Vertex/Node):表示实体,如人、物、概念等
- 边(Edge):表示节点之间的关系,如朋友关系、从属关系等
- 度(Degree):节点的度是指与该节点相连的边的数量
- 路径(Path):从一个节点到另一个节点的边序列
- 环(Cycle):起点和终点相同的路径
A.1.1.2 图的类型
| 图类型 | 描述 | 示例 |
|---|---|---|
| 无向图(Undirected Graph) | 边没有方向,表示双向关系 | 社交网络中的朋友关系 |
| 有向图(Directed Graph) | 边有方向,表示单向关系 | 网页之间的超链接关系 |
| 加权图(Weighted Graph) | 边上带有权重,表示关系的强度 | 道路网络中的距离或时间 |
| 无权图(Unweighted Graph) | 边没有权重,只表示关系的存在 | 社交网络中的关注关系 |
| 简单图(Simple Graph) | 没有自环和重边的图 | 大多数知识图谱 |
| 多重图(Multigraph) | 允许存在重边的图 | 表示多种关系的知识图谱 |
| 完全图(Complete Graph) | 任意两个节点之间都有边相连 | 稠密的社交网络 |
| 稀疏图(Sparse Graph) | 边的数量远小于完全图的图 | 大多数真实世界的图 |
A.1.2 图的表示方法
图可以用多种方式表示,不同的表示方法适用于不同的应用场景和算法。
A.1.2.1 邻接矩阵(Adjacency Matrix)
邻接矩阵是一个 n imes n 的矩阵,其中 n 是节点数量。如果节点 i 和节点 j 之间有边,则 A[i][j] = 1 (无权图)或 A[i][j] = 权重(加权图),否则 A[i][j] = 0 。
优点:
- 适合稠密图
- 快速判断两个节点之间是否有边(时间复杂度 O(1) )
缺点:
- 空间复杂度 O(n^2) ,对于大规模图不适用
- 不适合表示多重图
代码示例:
# 无向图的邻接矩阵表示
import numpy as np
# 节点:A, B, C, D(索引0, 1, 2, 3)
adjacency_matrix = np.zeros((4, 4), dtype=int)
# 添加边
edges = [(0, 1), (0, 2), (1, 2), (1, 3), (2, 3)]
for u, v in edges:
adjacency_matrix[u][v] = 1
adjacency_matrix[v][u] = 1 # 无向图
print("邻接矩阵:")
print(adjacency_matrix)A.1.2.2 邻接表(Adjacency List)
邻接表是一个数组或字典,每个元素对应一个节点的邻接节点列表。
优点:
- 适合稀疏图
- 空间复杂度 O(n + m) ,其中 m 是边的数量
- 适合表示多重图
缺点:
- 判断两个节点之间是否有边的时间复杂度 O(d) ,其中 d 是节点的度
代码示例:
# 无向图的邻接表表示
# 节点:A, B, C, D(索引0, 1, 2, 3)
adjacency_list = {}
# 初始化邻接表
for i in range(4):
adjacency_list[i] = []
# 添加边
edges = [(0, 1), (0, 2), (1, 2), (1, 3), (2, 3)]
for u, v in edges:
adjacency_list[u].append(v)
adjacency_list[v].append(u) # 无向图
print("邻接表:")
for node, neighbors in adjacency_list.items():
print(f"节点 {node} 的邻居:{neighbors}")A.1.2.3 边列表(Edge List)
边列表是一个包含所有边的列表,每条边表示为一个元组 (u, v) 或 (u, v, w) (加权图)。
优点:
- 简单直观
- 适合表示大规模图
- 适合需要遍历所有边的算法
缺点:
- 判断两个节点之间是否有边的时间复杂度 O(m)
代码示例:
# 无向图的边列表表示
# 节点:A, B, C, D(索引0, 1, 2, 3)
edge_list = [(0, 1), (0, 2), (1, 2), (1, 3), (2, 3)]
# 加权图的边列表表示
weighted_edge_list = [(0, 1, 2), (0, 2, 3), (1, 2, 1), (1, 3, 4), (2, 3, 5)]
print("边列表:")
for edge in edge_list:
print(edge)
print("\n加权边列表:")
for edge in weighted_edge_list:
print(edge)A.1.3 图的遍历算法
图的遍历是指从一个节点出发,访问图中所有可达节点的过程。常用的图遍历算法包括深度优先搜索(DFS)和广度优先搜索(BFS)。
A.1.3.1 深度优先搜索(DFS)
深度优先搜索是一种递归或栈实现的遍历算法,它尽可能深地访问节点,直到无法继续前进,然后回溯。
算法步骤:
- 访问起始节点,并标记为已访问
- 对于起始节点的每个未访问邻居,递归地进行深度优先搜索
时间复杂度:
- 邻接表表示: O(n + m)
- 邻接矩阵表示: O(n^2)
应用场景:
- 拓扑排序
- 连通性检测
- 环检测
- 路径查找
代码示例:
# 深度优先搜索(DFS)
def dfs(adjacency_list, start, visited=None):
if visited is None:
visited = set()
visited.add(start)
print(f"访问节点:{start}")
for neighbor in adjacency_list[start]:
if neighbor not in visited:
dfs(adjacency_list, neighbor, visited)
return visited
# 使用之前的邻接表
dfs(adjacency_list, 0)A.1.3.2 广度优先搜索(BFS)
广度优先搜索是一种队列实现的遍历算法,它按照距离起始节点的远近顺序访问节点。
算法步骤:
- 将起始节点入队,并标记为已访问
- 当队列不为空时:
a. 出队一个节点
b. 访问该节点
c. 将该节点的所有未访问邻居入队,并标记为已访问
时间复杂度:
- 邻接表表示: O(n + m)
- 邻接矩阵表示: O(n^2)
应用场景:
- 最短路径查找(无权图)
- 连通性检测
- 层次遍历
- 二分图检测
代码示例:
# 广度优先搜索(BFS)
from collections import deque
def bfs(adjacency_list, start):
visited = set()
queue = deque([start])
visited.add(start)
while queue:
node = queue.popleft()
print(f"访问节点:{node}")
for neighbor in adjacency_list[node]:
if neighbor not in visited:
visited.add(neighbor)
queue.append(neighbor)
return visited
# 使用之前的邻接表
bfs(adjacency_list, 0)A.1.4 图的基本算法
A.1.4.1 最短路径算法
最短路径算法用于查找两个节点之间的最短路径,常见的算法包括Dijkstra算法和Bellman-Ford算法。
A.1.4.1.1 Dijkstra算法
Dijkstra算法用于查找加权图中从单个源节点到所有其他节点的最短路径,要求所有边的权重非负。
算法步骤:
- 初始化距离数组,源节点距离为0,其他节点距离为无穷大
- 初始化优先队列,将源节点加入队列
- 当队列不为空时:
a. 取出距离最小的节点
b. 对于该节点的每个邻居,计算通过该节点到达邻居的距离
c. 如果新距离小于当前距离,则更新距离并将邻居加入队列
时间复杂度:
- 普通实现: O(m + n^2)
- 优先队列实现: O(m og n) (使用斐波那契堆可优化到 O(m + n og n) )
代码示例:
# Dijkstra算法寻找最短路径
import heapq
def dijkstra(adjacency_list, start, n):
# 初始化距离数组,无穷大表示不可达
INF = float('inf')
distances = [INF] * n
distances[start] = 0
# 优先队列:(距离, 节点)
priority_queue = [(0, start)]
heapq.heapify(priority_queue)
while priority_queue:
current_distance, current_node = heapq.heappop(priority_queue)
# 如果当前距离大于已知距离,跳过
if current_distance > distances[current_node]:
continue
# 遍历所有邻居
for neighbor, weight in adjacency_list[current_node]:
distance = current_distance + weight
# 如果找到更短的路径
if distance < distances[neighbor]:
distances[neighbor] = distance
heapq.heappush(priority_queue, (distance, neighbor))
return distances
# 加权图的邻接表表示(节点:0, 1, 2, 3)
weighted_adjacency_list = {
0: [(1, 2), (2, 3)],
1: [(0, 2), (2, 1), (3, 4)],
2: [(0, 3), (1, 1), (3, 5)],
3: [(1, 4), (2, 5)]
}
# 计算从节点0到所有节点的最短路径
distances = dijkstra(weighted_adjacency_list, 0, 4)
print("Dijkstra算法计算的最短路径:")
for i, distance in enumerate(distances):
print(f"节点0到节点{i}的最短距离:{distance}")A.1.4.2 最小生成树算法
最小生成树(MST)是连接图中所有节点的树,且边的权重之和最小。常用的算法包括Kruskal算法和Prim算法。
A.1.4.2.1 Kruskal算法
Kruskal算法基于贪心策略,按照边的权重从小到大排序,依次选择不形成环的边,直到连接所有节点。
算法步骤:
- 将所有边按权重从小到大排序
- 初始化一个空的最小生成树
- 对于每条边:
a. 如果添加这条边不会形成环,则将其添加到最小生成树
b. 如果最小生成树包含了所有节点,终止算法
时间复杂度:
- O(m og m) (主要用于排序)
应用场景:
- 网络设计(如通信网络、交通网络)
- 聚类分析
代码示例:
# Kruskal算法寻找最小生成树
# 并查集(用于检测环)
class UnionFind:
def __init__(self, n):
self.parent = list(range(n))
self.rank = [0] * n
def find(self, x):
if self.parent[x] != x:
self.parent[x] = self.find(self.parent[x]) # 路径压缩
return self.parent[x]
def union(self, x, y):
x_root = self.find(x)
y_root = self.find(y)
if x_root == y_root:
return False # 已经在同一集合中,形成环
# 按秩合并
if self.rank[x_root] < self.rank[y_root]:
self.parent[x_root] = y_root
else:
self.parent[y_root] = x_root
if self.rank[x_root] == self.rank[y_root]:
self.rank[x_root] += 1
return True
def kruskal(edge_list, n):
# 按权重排序边
edge_list.sort(key=lambda x: x[2])
uf = UnionFind(n)
mst = []
total_weight = 0
for u, v, weight in edge_list:
if uf.union(u, v):
mst.append((u, v, weight))
total_weight += weight
if len(mst) == n - 1:
break # 最小生成树已形成
return mst, total_weight
# 使用之前的加权边列表
mst, total_weight = kruskal(weighted_edge_list, 4)
print("Kruskal算法计算的最小生成树:")
for edge in mst:
print(edge)
print(f"总权重:{total_weight}")A.1.5 图的高级算法
A.1.5.1 社区检测
社区检测用于识别图中紧密连接的节点组,这些节点组内部的连接比外部更紧密。常用的算法包括Girvan-Newman算法、Louvain算法等。
A.1.5.1.1 Louvain算法
Louvain算法是一种基于模块度优化的社区检测算法,具有时间复杂度低、适合大规模图的特点。
算法步骤:
- 初始化每个节点为一个独立的社区
- 对于每个节点,尝试将其移动到邻居社区中,选择能最大程度提高模块度的社区
- 重复步骤2,直到模块度不再提高
- 合并同一社区的节点,构建新的图
- 重复步骤1-4,直到模块度不再提高
模块度(Modularity):
模块度是衡量社区划分质量的指标,表示社区内部边的数量与随机情况下的预期数量之差。
Q = rac{1}{2m} um_{i,j} eft( A_{ij} - rac{k_i k_j}{2m}
ight) elta(c_i, c_j)
其中, A_{ij} 是邻接矩阵, k_i 是节点 i 的度, m 是边的数量, c_i 是节点 i 的社区, elta(c_i, c_j) 是克罗内克函数(如果 c_i = c_j 则为1,否则为0)。
A.1.5.2 中心性分析
中心性分析用于识别图中重要的节点,常用的中心性指标包括度中心性、介数中心性、接近中心性和特征向量中心性等。
| 中心性指标 | 定义 | 应用场景 |
|---|---|---|
| 度中心性(Degree Centrality) | 节点的度 | 识别直接影响力大的节点 |
| 介数中心性(Betweenness Centrality) | 经过该节点的最短路径数量 | 识别控制信息流的节点 |
| 接近中心性(Closeness Centrality) | 到所有其他节点的平均距离的倒数 | 识别快速传播信息的节点 |
| 特征向量中心性(Eigenvector Centrality) | 邻居节点重要性的加权和 | 识别影响力广泛的节点 |
| PageRank | 基于链接分析的中心性 | 网页排名、重要节点识别 |
代码示例:
# 计算节点的度中心性
def degree_centrality(adjacency_list):
centrality = {}
n = len(adjacency_list)
for node, neighbors in adjacency_list.items():
centrality[node] = len(neighbors) / (n - 1) # 归一化
return centrality
# 使用之前的邻接表
degree_cent = degree_centrality(adjacency_list)
print("度中心性:")
for node, centrality in degree_cent.items():
print(f"节点 {node}:{centrality:.4f}")A.2 机器学习核心概念
A.2.1 机器学习的基本概念
机器学习是人工智能的一个分支,它使计算机能够从数据中学习,而不需要显式编程。
A.2.1.1 基本术语
- 数据集(Dataset):用于训练和测试模型的数据集合
- 样本(Sample):数据集中的单个数据点
- 特征(Feature):描述样本的属性
- 标签(Label):样本的目标值或类别
- 模型(Model):从数据中学习到的模式
- 训练(Training):使用训练数据学习模型参数的过程
- 测试(Testing):使用测试数据评估模型性能的过程
- 泛化(Generalization):模型对新数据的适应能力
A.2.1.2 机器学习的类型
根据学习方式和数据类型,机器学习可以分为以下几类:
监督学习(Supervised Learning):
- 训练数据包含特征和标签
- 目标是学习从特征到标签的映射
- 常见任务:分类、回归
- 常见算法:线性回归、逻辑回归、决策树、随机森林、支持向量机
无监督学习(Unsupervised Learning):
- 训练数据只包含特征,没有标签
- 目标是发现数据中的模式或结构
- 常见任务:聚类、降维、关联规则挖掘
- 常见算法:K-means、层次聚类、主成分分析(PCA)、关联规则
半监督学习(Semi-supervised Learning):
- 训练数据包含少量带标签样本和大量无标签样本
- 利用无标签数据提高模型性能
- 常见算法:自训练、协同训练、半监督支持向量机
强化学习(Reinforcement Learning):
- 智能体通过与环境交互学习最优策略
- 目标是最大化累积奖励
- 常见算法:Q-learning、深度Q网络(DQN)、策略梯度
A.2.2 监督学习
监督学习是最常用的机器学习类型,它从带有标签的训练数据中学习模型。
A.2.2.1 线性回归
线性回归用于预测连续值,它假设特征和标签之间存在线性关系。
模型公式:
y = w_0 + w_1 x_1 + w_2 x_2 + ... + w_n x_n
其中, y 是标签, x_1, x_2, ..., x_n 是特征, w_0, w_1, ..., w_n 是模型参数(权重)。
损失函数:
L(w) = rac{1}{2m} um_{i=1}^{m} (y_i - at{y}_i)^2
其中, m 是样本数量, y_i 是真实标签, at{y}_i 是预测值。
优化算法:
- 梯度下降法
- 最小二乘法
代码示例:
# 线性回归
from sklearn.linear_model import LinearRegression
import numpy as np
# 生成示例数据
X = np.array([[1], [2], [3], [4], [5]]) # 特征
y = np.array([2, 4, 5, 4, 5]) # 标签
# 创建并训练模型
model = LinearRegression()
model.fit(X, y)
# 预测
X_new = np.array([[6]])
y_pred = model.predict(X_new)
print(f"模型参数:w0 = {model.intercept_:.4f}, w1 = {model.coef_[0]:.4f}")
print(f"预测值:y_pred = {y_pred[0]:.4f}")A.2.2.2 逻辑回归
逻辑回归用于二分类问题,它将线性回归的输出通过sigmoid函数映射到0-1之间,表示概率。
模型公式:
at{y} = igma(w_0 + w_1 x_1 + ... + w_n x_n) = rac{1}{1 + e^{-(w_0 + w_1 x_1 + ... + w_n x_n)}}
损失函数:
L(w) = -rac{1}{m} um_{i=1}^{m} [y_i og(at{y}_i) + (1 - y_i) og(1 - at{y}_i)]
优化算法:
- 梯度下降法
- 牛顿法
代码示例:
# 逻辑回归
from sklearn.linear_model import LogisticRegression
import numpy as np
# 生成示例数据(二分类)
X = np.array([[1], [2], [3], [4], [5], [6], [7], [8]])
y = np.array([0, 0, 0, 0, 1, 1, 1, 1])
# 创建并训练模型
model = LogisticRegression()
model.fit(X, y)
# 预测
X_new = np.array([[3.5], [5.5]])
y_pred = model.predict(X_new)
y_pred_proba = model.predict_proba(X_new)
print(f"模型参数:w0 = {model.intercept_[0]:.4f}, w1 = {model.coef_[0][0]:.4f}")
print(f"预测类别:{y_pred}")
print(f"预测概率:{y_pred_proba}")A.2.3 无监督学习
无监督学习用于发现数据中的模式或结构,训练数据没有标签。
A.2.3.1 K-means聚类
K-means聚类是一种常用的聚类算法,它将数据分为K个簇,使得簇内的相似度高,簇间的相似度低。
算法步骤:
- 随机选择K个初始聚类中心
- 重复以下步骤直到收敛:
a. 分配每个样本到最近的聚类中心
b. 重新计算每个簇的聚类中心(取平均值)
距离度量:
- 欧氏距离: d(x, y) = qrt{um_{i=1}^{n} (x_i - y_i)^2}
代码示例:
# K-means聚类
from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt
# 生成示例数据
X = np.array([[1, 2], [1, 4], [1, 0], [10, 2], [10, 4], [10, 0]])
# 创建并训练模型
kmeans = KMeans(n_clusters=2, random_state=0)
kmeans.fit(X)
# 预测
y_pred = kmeans.predict(X)
# 可视化
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], c='red', marker='x')
plt.title('K-means Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()
print(f"聚类中心:{kmeans.cluster_centers_}")
print(f"预测结果:{y_pred}")A.2.4 模型评估与选择
模型评估用于衡量模型的性能,模型选择用于选择最优的模型参数或算法。
A.2.4.1 评估指标
A.2.4.1.1 分类问题的评估指标
| 指标 | 公式 | 描述 |
|---|---|---|
| 准确率(Accuracy) | rac{TP + TN}{TP + TN + FP + FN} | 正确预测的样本数占总样本数的比例 |
| 精确率(Precision) | rac{TP}{TP + FP} | 预测为正类的样本中,实际为正类的比例 |
| 召回率(Recall) | rac{TP}{TP + FN} | 实际为正类的样本中,被正确预测的比例 |
| F1分数 | 2 imes rac{Precision imes Recall}{Precision + Recall} | 精确率和召回率的调和平均数 |
| 混淆矩阵 | 显示分类结果的矩阵,行表示实际类别,列表示预测类别 |
其中, TP 是真阳性, TN 是真阴性, FP 是假阳性, FN 是假阴性。
A.2.4.1.2 回归问题的评估指标
| 指标 | 公式 | 描述 |
|---|---|---|
| 均方误差(MSE) | rac{1}{m} um_{i=1}^{m} (y_i - at{y}_i)^2 | 预测值与真实值之差的平方的平均值 |
| 均方根误差(RMSE) | qrt{rac{1}{m} um_{i=1}^{m} (y_i - at{y}_i)^2} | 均方误差的平方根,与原始数据单位相同 |
| 平均绝对误差(MAE) | rac{1}{m} um_{i=1}^{m} | y_i - at{y}_i |
| 决定系数(R²) | 1 - rac{um_{i=1}^{m} (y_i - at{y}i)^2}{um{i=1}^{m} (y_i - ar{y})^2} | 模型解释的方差占总方差的比例,范围[0, 1] |
A.2.4.2 交叉验证
交叉验证是一种用于评估模型泛化能力的方法,它将数据分为训练集和验证集,多次训练和验证模型。
K折交叉验证:
- 将数据分为K个相等的子集
- 对于每个子集i:
a. 使用其他K-1个子集作为训练集
b. 使用子集i作为验证集
c. 评估模型性能 - 计算K次评估结果的平均值
代码示例:
# K折交叉验证
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
# 使用之前的逻辑回归数据
scores = cross_val_score(LogisticRegression(), X, y, cv=5)
print(f"5折交叉验证准确率:{scores}")
print(f"平均准确率:{scores.mean():.4f}")A.3 深度学习基本原理
深度学习是机器学习的一个分支,它使用多层神经网络来学习数据的表示。
A.3.1 神经网络基础
神经网络由多个神经元组成,神经元之间通过连接传递信号。
A.3.1.1 神经元模型
神经元是神经网络的基本单元,它接收输入,进行线性组合,然后通过激活函数输出结果。
数学模型:
y = f(w_0 + w_1 x_1 + w_2 x_2 + ... + w_n x_n)
其中, f 是激活函数。
A.3.1.2 神经网络结构
神经网络由输入层、隐藏层和输出层组成:
- 输入层:接收原始数据
- 隐藏层:学习数据的特征表示
- 输出层:输出预测结果
前向传播:
信号从输入层流向输出层的过程。
反向传播:
计算损失函数对模型参数的梯度,用于更新参数。
A.3.2 激活函数
激活函数引入非线性,使神经网络能够学习复杂的函数关系。
A.3.2.1 常见激活函数
| 激活函数 | 公式 | 特点 | 应用场景 |
|---|---|---|---|
| Sigmoid | f(x) = rac{1}{1 + e^{-x}} | 将输入映射到(0, 1),平滑连续 | 二分类输出层 |
| Tanh | f(x) = rac{e^x - e^{-x}}{e^x + e^{-x}} | 将输入映射到(-1, 1),零均值 | 隐藏层 |
| ReLU | f(x) = max(0, x) | 计算简单,缓解梯度消失 | 隐藏层(常用) |
| Leaky ReLU | f(x) = max(αx, x) | 解决ReLU的死亡神经元问题 | 隐藏层 |
| Softmax | f(x_i) = rac{e^{x_i}}{um_{j=1}^{n} e^{x_j}} | 将输入映射到概率分布 | 多分类输出层 |
代码示例:
# 激活函数实现
import numpy as np
import matplotlib.pyplot as plt
# Sigmoid函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# Tanh函数
def tanh(x):
return np.tanh(x)
# ReLU函数
def relu(x):
return np.maximum(0, x)
# Leaky ReLU函数
def leaky_relu(x, alpha=0.01):
return np.maximum(alpha * x, x)
# Softmax函数
def softmax(x):
exp_x = np.exp(x - np.max(x)) # 数值稳定
return exp_x / np.sum(exp_x, axis=0)
# 可视化激活函数
x = np.linspace(-5, 5, 100)
plt.figure(figsize=(12, 8))
plt.subplot(2, 3, 1)
plt.plot(x, sigmoid(x))
plt.title('Sigmoid')
plt.subplot(2, 3, 2)
plt.plot(x, tanh(x))
plt.title('Tanh')
plt.subplot(2, 3, 3)
plt.plot(x, relu(x))
plt.title('ReLU')
plt.subplot(2, 3, 4)
plt.plot(x, leaky_relu(x))
plt.title('Leaky ReLU')
plt.subplot(2, 3, 5)
plt.plot(x, softmax(x))
plt.title('Softmax')
plt.tight_layout()
plt.show()A.3.3 前向传播与反向传播
前向传播是计算神经网络输出的过程,反向传播是计算梯度并更新参数的过程。
A.3.3.1 前向传播
示例:一个简单的三层神经网络(输入层2个神经元,隐藏层3个神经元,输出层1个神经元)。
前向传播计算:
- 隐藏层输入: z_1 = W_1 x + b_1
- 隐藏层输出: a_1 = f(z_1)
- 输出层输入: z_2 = W_2 a_1 + b_2
- 输出层输出: a_2 = f(z_2)
其中, W_1, W_2 是权重矩阵, b_1, b_2 是偏置向量, f 是激活函数。
A.3.3.2 反向传播
反向传播使用链式法则计算损失函数对每个参数的梯度,然后使用梯度下降法更新参数。
梯度下降法:
w = w - α rac{artial L}{artial w}
其中, α 是学习率, rac{artial L}{artial w} 是损失函数对权重 w 的梯度。
A.3.4 常见神经网络架构
A.3.4.1 卷积神经网络(CNN)
卷积神经网络主要用于处理图像数据,它使用卷积层提取局部特征。
核心组件:
- 卷积层:提取局部特征
- 池化层:降低维度,减少计算量
- 全连接层:分类或回归
应用场景:
- 图像分类
- 目标检测
- 图像分割
A.3.4.2 循环神经网络(RNN)
循环神经网络用于处理序列数据,它具有记忆能力,能够处理变长序列。
核心特点:
- 隐藏状态包含历史信息
- 适合处理时间序列、自然语言等序列数据
变种:
- LSTM(长短期记忆网络):解决长期依赖问题
- GRU(门控循环单元):LSTM的简化版本
应用场景:
- 语言建模
- 机器翻译
- 情感分析
A.3.4.3 注意力机制
注意力机制允许模型关注输入的不同部分,提高了模型处理长序列的能力。
核心思想:
- 计算查询和键的相似度
- 生成注意力权重
- 加权求和值,得到输出
应用场景:
- 机器翻译
- 文本摘要
- 图像描述
A.3.5 预训练语言模型
预训练语言模型在大规模文本数据上预训练,然后在下游任务上微调,取得了显著的性能提升。
A.3.5.1 Transformer架构
Transformer是一种基于自注意力机制的架构,它完全使用注意力机制,不使用循环结构。
核心组件:
- 多头自注意力层
- 前馈神经网络
- 层归一化
- 残差连接
应用:
- BERT
- GPT
- T5
A.3.5.2 BERT(Bidirectional Encoder Representations from Transformers)
BERT是一种双向预训练语言模型,它在大量文本上预训练,然后在下游任务上微调。
特点:
- 双向Transformer编码器
- 掩码语言模型(MLM)预训练任务
- 下一句预测(NSP)预训练任务
应用场景:
- 文本分类
- 命名实体识别
- 问答系统
- 情感分析
代码示例:
# 使用Hugging Face Transformers库加载BERT模型
from transformers import BertTokenizer, BertModel
# 加载预训练模型和分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
# 编码文本
text = "Hello, how are you?"
inputs = tokenizer(text, return_tensors='pt')
# 前向传播
outputs = model(**inputs)
# 获取隐藏状态
hidden_states = outputs.last_hidden_state
pooler_output = outputs.pooler_output
print(f"输入文本:{text}")
print(f"隐藏状态形状:{hidden_states.shape}")
print(f"Pooler输出形状:{pooler_output.shape}")A.4 本章小结
本附录介绍了知识图谱与AI融合应用所需的数学与算法基础,包括:
图论基础:图的基本概念、表示方法、遍历算法和高级算法,这些是知识图谱的核心数学基础。
机器学习核心概念:监督学习、无监督学习、模型评估与选择,以及常见的机器学习算法,如线性回归、逻辑回归、K-means聚类等。
深度学习基本原理:神经网络基础、激活函数、前向传播与反向传播,以及常见的神经网络架构,如CNN、RNN、Transformer等。
这些数学与算法基础为理解和应用知识图谱与AI融合技术提供了必要的理论支持。读者可以根据自己的需求深入学习相关内容,进一步提高自己的技术水平。