5.20-5.21学习:

  • 观看 AI基础理论-人工智能理论-《双向深度学习》
  • -PCA、K-mean、GMM
  • -简单认识VAE变分自编码器
  • 观看 AI基础理论-人工智能理论-《能耗高效的深度学习》
  • 观看 AI基础理论-人工智能理论-《预训练语言模型》
  • -语言模型
  • -前馈神经网络语言模型
  • -循环神经网络语言模型
  • -初步了解Transformer模型
  • -主流预训练语言模型ELMo、BERT、GPT的对比

  本文所有代码均在jupyter notebook上运行,下载链接:https://pan.baidu.com/s/1XZmvcaZ1u_xZhcNokOyqNA?pwd=td7g
提取码:td7g

主成分分析 PCA

  参考网页:

  (3 封私信) 如何通俗易懂地讲解什么是 PCA(主成分分析)? - 知乎 (zhihu.com)

  一文读懂PCA分析 (原理、算法、解释和可视化) - 知乎 (zhihu.com)

  主成分分析(PCA)原理详解 - 知乎 (zhihu.com)

PCA简介

  PCA是一种线性代数降维的方法,利用正交变换把一系列可能线性相关的变量转化成一组线性不相关的新变量,也成为主成分,从而利用新变量在更小的维度下展示数据的特性。

  主成分本质上是原有变量的线性组合,数目小于原有变量。主成分包含原有变量的大部分特征,并且因为有更低的维度,所以便于进一步分析。

  为了最大限度的保留对原有数据的解释能力,一般用最大方差理论最小损失理论来得到主成分的第一个维度,随后每一个主成分的维度都与前一个正交。

PCA的意义

  简化运算、去除数据噪音、降低后期计算开销、发现隐含相关变量、利用散点图便于数据可视化…

PCA的关键

  通过计算数据矩阵的协方差矩阵,然后得到协方差矩阵的特征值特征向量,选择特征值最大(即方差最大)的k个特征向量组成新的矩阵。这样就实现了将数据矩阵转换到新的空间当中,实现了数据的降维。

  由于得到协方差矩阵的特征值特征向量有两种方法:特征值分解协方差矩阵、奇异值分解协方差矩阵,所以PCA算法有两种实现方法:基于特征值分解协方差矩阵实现PCA算法、基于SVD分解协方差矩阵实现PCA算法。

PCA算法推导-基于特征值分解协方差矩阵

c90d51bab4c050a4cc4f6c3e5a1b81d

K-means 聚类算法

  参考链接:

  5 分钟带你弄懂 K-means 聚类 - 知乎 (zhihu.com)

  K-means算法(一篇文章讲透)_k-means算法原理-CSDN博客

  【机器学习】K-means(非常详细) - 知乎 (zhihu.com)

聚类和归类

  首先要明白分类和聚类的区别。

  分类:前提是类别已知,通过对已知类别的数据进行训练和学习,找到这些不同类的特征,再对未知类别的数据进行分类,属于监督学习

  聚类:事先类别未知,通过聚类分析将数据聚合成几个群体,聚类不需要对数据进行训练和学习,属于无监督学习

  tips:有监督学习和无监督学习就看输入的数据是否有已知的确定的标签。

K-means聚类算法简介

  K-means是聚类算法中最常用的一种,其思想大致是“迭代选举”,步骤如下:

  1、首先指定希望通过聚类得到几个分组(k个);

  2、从数据集中随机选取k个数据点作为初始质心;

  3、对集合中每一个点都计算与每一个质心的距离,谁近就和谁归成一类;

  4、第一次归类完成后,通过算法在每一类中选出新的质心;

  5、如果新质心和旧质心之间的距离小于某一个设置的阈值(表示重新计算的质心的位置变化不大,趋于稳定,或者说收敛),可以认为我们进行的聚类已经达到期望的结果,算法终止;

  6、如果新质心和旧质心距离差距很大,则迭代3~5步骤。

  K-means算法易得到局部最优解,其优点是:简单、效果好、伸缩性好、复杂度低;缺点是:K值人为设定、对异常值敏感、不适合过于离散的分类任务

K-means算法的改进与优化

  针对K-means算法的缺点,有一些可以改进的方法。

  比如对数据进行预处理:提前把数据归一化或者标准化,进行异常点检测,去除异常点和噪声。

  也可也通过一些方法选取合适的K值:手肘法和Gap statistic法,Github 上一个项目叫 gap_statistic ,方便我们获取建议的分类个数。

K-means算法演示

import numpy as np  
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

# 创建一个简单的二维数据集
X, y_true = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# 初始化KMeans对象,设置聚类数量为4,但max_iter设置为1以便手动迭代
kmeans = KMeans(n_clusters=4, max_iter=1, random_state=0)

# 预测初始聚类并计算初始中心点
kmeans.fit(X)
labels = kmeans.predict(X)
initial_centroids = kmeans.cluster_centers_

# 初始化中心点列表(包含初始中心点)
centroids = [initial_centroids]

# 模拟迭代过程
for _ in range(5): # 假设我们手动进行5次迭代
# 使用上一次迭代的中心点进行预测
new_labels = kmeans.predict(X)

# 计算新的中心点
new_centroids = np.array([X[new_labels == j].mean(0) for j in range(kmeans.n_clusters)])

# 更新中心点列表
centroids.append(new_centroids)

# 绘制初始数据点和初始中心点
fig, ax = plt.subplots()
scatter = ax.scatter(X[:, 0], X[:, 1], c='gray', marker='.', label='Data Points')
centroids_scatter = ax.scatter([], [], c='black', marker='*', s=100, label='Centroids')
ax.legend()
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
ax.set_title('K-means Clustering Animation')

# 定义更新函数
def update(frame):
centroids_scatter.set_offsets(centroids[frame])
return scatter, centroids_scatter

# 创建动画
ani = FuncAnimation(fig, update, frames=len(centroids), interval=500, blit=True)

# 显示动画
plt.show()
a9ca6956f6e8390f10ed4b3b367ef3a

高斯混合模型GMM

  参考链接:

  python - 高斯混合模型 GMM 的详细解释 - deephub - SegmentFault 思否

  深度探索:机器学习中的高斯混合模型(GMM)原理及其应用_高斯混合模型原理实现与应用-CSDN博客

  高斯混合模型(GMM)介绍以及学习笔记_log 和guassic混合效应模型-CSDN博客

GMM原理

  高斯混合模型的工作原理和K-means类似,可以想象成K-means的概率版本。K-means使用基于距离的方法,而GMM使用概率的算法,是一个将事物分解为若干的基于高斯概率密度函数(正态分布曲线)形成的模型。

  GMM假设假设数据服从多元高斯分布,能够适应各种复杂的、非线性的、非凸的数据分布,特别适合处理具有椭圆状分布的簇。(K-means假定簇是凸的且各簇大小差异不大,对于形状规则、分布均匀的数据集表现良好。当数据集中的簇形状不规则、大小差异显著或存在非球形分布时,K-means的性能可能下降。)

GMM算法演示

import numpy as np  
import matplotlib.pyplot as plt
from sklearn.mixture import GaussianMixture
from scipy.stats import multivariate_normal

# 生成模拟数据的部分
# ----------------------------

# 设置随机数种子以保持结果的一致性
np.random.seed(10086)

# 样本数量
n_samples = 500

# 各个高斯分布的均值
means = [(0, 0), (5, 4), (1, 2)]

# 各个高斯分布的协方差矩阵
covariances = [
[[1, 0], [0, 1]],
[[1, 0.5], [0.5, 1]],
[[0.5, 0], [0, 0.5]]
]

# 各个高斯分布在混合模型中的权重
weights = [0.3, 0.4, 0.3]

# 生成模拟数据
# 对每个高斯分布,根据其权重生成相应数量的样本,并将它们堆叠在一起
X = np.vstack([
multivariate_normal(mean=means[i], cov=covariances[i]).rvs(int(n_samples*weights[i]))
for i in range(len(means))
]).astype(np.float32)


# 使用scikit-learn的GaussianMixture模型进行拟合和预测
# ----------------------------------------

# 初始化GMM模型,指定混合成分的数量
gmm = GaussianMixture(n_components=3)

# 使用数据拟合模型
gmm.fit(X)

# 预测每个数据点最可能来自哪个高斯分布
labels = gmm.predict(X)


# 数据可视化部分
# --------------------

# 创建一个绘图窗口
plt.figure(figsize=(10, 8))

# 绘制数据点,颜色根据它们所属的高斯分布标签进行区分
plt.scatter(X[:, 0], X[:, 1], c=labels, s=10, cmap='viridis', zorder=2)

# 绘制高斯分布的中心(均值),用红色星号表示
centers = gmm.means_
plt.scatter(centers[:, 0], centers[:, 1], s=100, marker='*', c='red', zorder=3)

# 绘制等高线图表示各个高斯分布
# 为了绘制等高线,首先创建一个网格来评估每个高斯分布的概率密度函数
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100), np.linspace(y_min, y_max, 100))

# 初始化一个数组来存储每个网格点在每个高斯分布下的概率密度
Z = -np.inf * np.ones((xx.shape[0], xx.shape[1], gmm.n_components))

# 对每个高斯分布,计算网格上每个点的概率密度,并存储在Z中
for i in range(gmm.n_components):
dist = multivariate_normal(mean=gmm.means_[i], cov=gmm.covariances_[i])
Z[:, :, i] = dist.pdf(np.dstack((xx, yy)))

# 绘制等高线图
for i in range(gmm.n_components):
# 等高线级别设置为该高斯分布的权重乘以其概率密度的最大值
contours = plt.contour(xx, yy, Z[:, :, i], levels=[gmm.weights_[i]*np.max(Z[:, :, i])],
colors=[plt.cm.viridis(i / gmm.n_components)], alpha=0.6,
linestyles=['-'])

# 设置x和y轴的范围
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)

# 添加标题
plt.title('Gaussian Mixture Model')

# 显示图像
plt.show()
2ccbfbb02c2cd0bd259b63b74aa8d5f

GMM等高线图的意义

  1、展示高斯成分的分布:等高线图展示了每个高斯成分的概率密度函数(PDF)在二维空间上的投影。颜色越深,表示该点属于该高斯成分的概率越高。这有助于我们理解数据的聚类结构,因为每个高斯成分通常对应一个数据簇。

  2、识别重叠区域:当高斯成分在数据空间中有重叠时,等高线图会显示出这些重叠区域。这些区域中的数据点可能属于多个高斯成分,这反映了GMM处理重叠和复杂分布的能力。

  3、评估模型拟合:通过观察等高线图,我们可以评估GMM模型对数据集的拟合程度。如果等高线图能够很好地覆盖数据点,并且没有过多的空白区域,那么说明模型已经捕获了数据的主要结构。

  4、指导后续分析:等高线图还可以指导后续的分析工作。例如,我们可以根据等高线图识别出数据中的异常值或噪声点,因为它们可能位于等高线图之外或远离任何高斯成分的中心。此外,我们还可以根据等高线图的形状和位置来选择合适的聚类算法或参数设置。

简单认识VAE变分自编码器

  变分自编码器(Variational AutoEncoder,VAE),是一种生成模型VAE能从输入数据中学习潜在变量,并生成新的样本

VAE模型概述

  从概率图的角度看,VAE是带隐变量的有向概率图模型

  从神经网络的角度看,VAE是以自编码器(AutoEncoder,AE)为框架的生成模型。VAE把在编码器确定的分布中进行采样的结果作为解码器的输入,完成对输入图像进行重建。关键在于编码器直接输出的不是潜在空间(编码空间)的具体特征,而是特征分布

VAE模型结构

  VAE模型由两部分组成:编码器(Encoder)和解码器(Decoder)。编码器将输入数据压缩成一个低维的潜在向量(也称为隐变量),解码器则将这个潜在向量解码成原始数据的重构版本。

  VAE模型的核心思想是最大化输入数据与重构数据之间的似然性,同时最小化潜在向量的熵

  VAE的输入和输出都是连续向量。输入通常是图像、文本或声音等数据类型,输出可以是相同类型的数据,也可以是新的数据样本。

VAE模型的应用

  VAE模型可以用于数据的增广分布,它可以生成与原始数据分布相似但是又具有一定变化的新数据样本,从而扩展原始数据集合的规模和多样性。

  VAE在自然图像处理领域也有显著应用,包括图像分类、检测、分割等任务。VAE模型可以用于生成和表示图像数据的先验分布,对于图像恢复、增强等任务也具有重要意义。

  VAE不仅能够生成具有高度真实感的图像,还能用于文本数据,打开了自然语言处理(NLP)领域的新可能性。通过将文本数据编码为潜在空间中的向量,VAE能够生成新的文本数据,这对于文本生成、机器翻译、情感分析等任务特别有用。

  在生物信息学中,VAE模型也有广泛的应用,如基因组比对、蛋白质结构预测、生物序列分类和生物网络建模等。

能耗高效的深度学习

  这一节课主要介绍华为的最新研究成果,研究如何在保证性能的前提下,降低深度学习的资源消耗。了解即可,圈子比较小,不用去学习。

语言模型

  参考网页:

  一起入门语言模型(Language Models) - 知乎 (zhihu.com)

  一文解码语言模型:语言模型的原理、实战与评估_6.像这种根据语音特征参数进行训练的模型称为语言模型。7.将语音识别需要的文-CSDN博客

  深入理解语言模型 Language Model - 知乎 (zhihu.com)

语言模型的基本概念

  语言模型Language Model,是一个用于建模的自然语言的概率模型。给定一个任意的词序列,它能计算出这个序列是一句话的概率。例如有两个词序列:“你|好|漂亮|啊”,这明显是一句话,一个合格的语言模型会给出很大的概率值;“手机|的|睡觉|好快”,这明显不是一句话,语言模型给出的概率就很小。

  语言模型试图捕捉语言的统计特性,以便能够预测或生成文本。例如,对于一个由词 ( w_1, w_2, …, w_m ) 组成的句子,语言模型会计算这个句子的概率 ( p(w_1, w_2, …, w_m) ),这个概率反映了句子作为一个整体出现的频率。这个概率可以通过链式法则分解为一系列条件概率的乘积:

beef2ab808ec6f55e1972941e57edd8

  其中,( p(w_i | w_1, …, w_{i-1}) ) 是在给定前面 ( i-1 ) 个词的情况下,第 ( i ) 个词出现的条件概率。在实际应用中,因为参数量巨大,直接计算这些条件概率是非常困难的。

语言模型的分类

  1、统计语言模型: 最早的语言模型类别,主要基于统计理论,通常使用n-gram模型,通过统计语料库中词语的出现频率来预测下一个词。
  2、神经网络语言模型: 使用神经网络来预测下一个词,能够捕捉更复杂的语言模式,其中最著名的是递归神经网络(RNN)和长短期记忆网络(LSTM)。
  3、Transformer模型: Transformer模型是一种基于自注意力机制的模型,如BERT、GPT等,在处理长距离依赖和并行计算方面表现出色。

统计语言模型(n-gram)

  在统计学模型横行NLP的时代,语言模型任务的扛把子是N-gram语言模型。为了简化计算,我们引入一阶马尔可夫假设:每个词只依赖前一个词:

def51ce2f61260df540df143369edc8

  此时有:

c9d0487a5e78661f2d56bd2dc5fcf72

  我们也可以引入二阶马尔可夫假设:每个词依赖前两个词:

680c27cd93f75766d0148f7eddbbb85

  此时有:

074fd1976a5c8f2b324f7a706ab36ba

  以N=3的tri-gram语言模型为例,它使用二阶马尔可夫假设,此时可以通过计数来得到概率。

0335618e96b958ee35243fd8fbe3084

  其中,count()表示在训练集中出现的次数。

  N-gram 语言模型的优点:(1) 采用极大似然估计,参数易训练;(2) 完全包含了前 n-1 个词的全部信息;(3) 可解释性强,直观易理解。缺点:(1) 缺乏长期依赖,只能建模到前 n-1 个词;(2) 随着 n 的增大,参数空间呈指数增长;(3) 数据稀疏,难免会出现OOV的问题;(4) 单纯的基于统计频次,泛化能力差。

  *OOV:未登录词的问题,即测试集中出现了训练集中未出现过的词,导致语言模型计算出的概率为0。

前馈神经网络语言模型

  Bengio 在03年的这篇经典 paper 中,提出了如下图所示的前馈神经网络结构。

image-20200914002201170

  先给每个词在连续空间中赋予一个向量(词向量),再通过神经网络去学习这种分布式表征。利用神经网络去建模当前词出现的概率与其前 n-1 个词之间的约束关系。

  从上图中可以看出网络结构很简单,将前n-1个词的向量(Wi)进行拼接作为网络输入,经过一次非线性变换,最后输出字典中每个词的概率作为预测结果。

56530f58089cc33ac0df163f8ab5df0

  图中的绿色虚线对应公式中的 W*x ,在实验阶段,虚线是可选的,通过将 W 设置为0来消除虚线。

  这种方式相比 n-gram 具有更好的泛化能力,很大程度地降低了数据稀疏带来的问题。但是这个结构的明显缺点是仅包含了有限的前文信息

循环神经网络语言模型

  参考网页:

  史上最详细循环神经网络讲解(RNN/LSTM/GRU) - 知乎 (zhihu.com)

  基于循环神经网络的语言模型的介绍与TensorFlow实现(2):神经网络语言模型与数据预处理 - 知乎 (zhihu.com)

循环神经网络语言模型概述

  与传统的前馈神经网络不同,RNNLM能够利用其内部状态(记忆)来处理输入序列中的单词。核心思想是在模型中引入时间维度,使得模型能够记住并利用之前的信息。在RNNLM中,每个时刻的输出不仅取决于当前的输入,还受到之前时刻状态的影响。这种结构使得RNNLM能够捕捉到语言中的时序特性和上下文信息。

  循环神经网络语言模型的核心可以用如下公式表示:

7011f0eac1402d7f5005fc9400c23dc

  其中,( h_t ) 是在时间 ( t ) 的隐藏层状态,( x_t ) 是在时间 ( t ) 的输入,( W ), ( U ), 和 ( V ) 是模型参数,( f ) 和 ( g ) 分别是隐藏层和输出层的激活函数。

循环神经网络原理推导

  循环神经网络的结构图:

67df5f60fc900a3e0fde34dc71994fe

  如果先不看w,左边的部分其实就是把一个三层的全连接神经网络竖向看的视角。U是输入层到隐藏层的参数矩阵,V是隐藏层到输出层的参数矩阵,实际都是多维的。

  然后把左边加上w,加上时间步,展开后可以得到下图:

484731e9a07c2e47e9b3994ac9b7b6e

  W其实是每个时间点之间的权重矩阵w的值都是相同的每一时刻的隐藏层不仅由该时刻的输入层决定,还由上一时刻的隐藏层决定

  整体的公式也可以表示成下面这个格式:

3703fa58b86dc9690492ab8fae9f941

循环神经网络语言模型结构

  RNN的神经语言模型结构如下图1所示,假如针对一句话“大海的颜色是蓝色的”,其中包括了三个部分:

c82981fe864e638f1dee6bc2548329d

  每一步的输出结果表示在上下文的情况下,该位置的单词是单词表中单词的概率,我们希望概率最大的单词就是真实的结果输出

Transformer模型

  参考网页:

  Transformer模型详解(图解最完整版) - 知乎 (zhihu.com)

  理解语言的 Transformer 模型 | TensorFlow Core (google.cn)

  【超详细】【原理篇&实战篇】一文读懂Transformer-CSDN博客

  Transformer模型是一种革命性的神经网络架构,它在自然语言处理(NLP)领域中大放异彩。这个模型由Google的研究团队在2017年的论文《Attention Is All You Need》中首次提出。它的核心特点是完全基于注意力机制(Attention Mechanism),不依赖于传统的递归神经网络(RNN)或卷积神经网络(CNN)来处理序列数据。

Transformer模型的主要特点

  1、自注意力机制(Self-Attention):这是Transformer的核心概念之一,它使模型能够同时考虑输入序列中的所有位置,而不是像循环神经网络(RNN)或卷积神经网络(CNN)一样逐步处理。自注意力机制允许模型根据输入序列中的不同部分来赋予不同的注意权重,从而更好地捕捉语义关系。

  2、编码器-解码器架构:Transformer包含编码器(Encoder)和解码器(Decoder)两部分,每部分由多个相同的层组成。编码器处理输入序列,解码器生成输出序列,两者通过注意力机制相互作用。

  3、位置编码(Positional Encoding):由于Transformer没有内置的序列位置信息,它需要额外的位置编码来表达输入序列中单词的位置顺序。位置编码通过将一个与位置相关的向量加到输入的词向量上,使模型能够利用单词的顺序信息。

  4、并行计算能力:自注意力机制允许模型在处理序列时进行大规模的并行计算,显著提高了训练效率。

  5、多头注意力(Multi-Head Attention):Transformer使用多头注意力机制来让模型在不同的子空间中学习信息。这让模型可以从不同的角度理解数据,提高了模型的表达能力。

  6、残差连接(Residual Connections)和层归一化(Layer Normalization):为了帮助模型训练更深的结构并加速收敛,Transformer在每个自注意力层和前馈神经网络层之间都使用了残差连接和层归一化。残差连接允许模型跳过某些层,从而更容易地学习恒等映射,层归一化则有助于稳定模型的训练过程。

Transformer模型结构

  模型复杂,请详细参考网页链接:Transformer模型详解(图解最完整版) - 知乎 (zhihu.com)

  整体架构:

252ba01323d441bcf0bd0c2c944a488

  Encoder和Decoder:

c93666c5881013354863b4bc2e95a52

Transformer模型实例代码

  本代码来自tensorflow官方,以整理在链接中可以下载,并详细给上了注释。

  首先安装数据包,此时博主第一次没有成功,加上了–user才成功。

pip install tensorflow-datasets --user

  TFDS 提供了一组现成的数据集,适合与 TensorFlow、Jax 和其他机器学习框架配合使用。这里安装的是稳定版本。参考网页:TensorFlow Datasets (google.cn)

  然后参考链接文件即可。

主流预训练语言模型ELMo、BERT、GPT的对比

BERT, GPT, ELMo之间的区别

  1、三者所选取的特征提取器不同:

    BERT采用的是Transformer架构中的Encoder模块;

    GPT采用的是Transformer架构中的Decoder模块;

    ELMo采用的双层双向LSTM模块。

  2、三者所采用的语言模型单/双向不同:

    BERT采用的是最彻底的双向语言模型, 可以同时关注context before和context after

    GPT采用的是单向语言模型,,即Transformer中的Decoder,,由于采用了mask机制,,所以未来信息context after都不可见

    ELMo表面上被认为是双向语言模型,,但实际上是左右两个单向LSTM模型分别提取特征,再进行简单的拼接融合。

BERT, GPT, ELMo各自的优点和缺点

  1、ELMo优点:从早期的Word2Vec预训练模型的无法解决多义词的问题的缺点出发进行改进,ELMo可以根据上下文动态调整word embedding,可以解决多义词的问题。

  ELMO缺点:ELMo使用LSTM提取特征的能力弱于Transformer;ELMo使用向量拼接的方式融合上下文特征的能力弱于Transformer。

  2、GPT优点:GPT使用了Transformer提取特征,使得模型能力大幅提升。

  GPT缺点:GPT只使用了单向Decoder, 无法融合未来的信息。

  3、BERT优点:BERT使用了双向Transformer提取特征, 使得模型能力大幅提升;添加了两个预训练任务,MLM + NSP的多任务方式进行模型预训练。  

  BERT缺点:模型过于庞大、参数量太多,需要的数据和算力要求过高,训练好的模型应用场景要求高;更适合用于语言嵌入表达,语言理解方面的任务,不适合用于生成式的任务。