Tensor的激活函数
深度学习中,Tensor(张量)的激活函数是一类作用于张量数据的非线性函数,用于给神经网络引入非线性特性。
它们通常应用在神经网络层的输出张量上,通过对张量中的每个元素进行逐元素运算,改变张量的数值分布,从而让模型能够学习和表达复杂的非线性关系
核心作用:
神经网络的基本计算(如矩阵乘法、卷积)本质上是线性操作。如果没有激活函数,无论网络有多少层,最终输出仍是输入的线性组合,无法拟合现实世界中复杂的非线性数据(如图像、语言、声音等)。激活函数通过引入非线性,使得神经网络能够逼近任意复杂的函数。
常见的激活函数(均作用于张量元素)

作用:将张量元素映射到 (0, 1) 区间,常用于二分类问题的输出层,表达概率含义
缺点:存在梯度消失问题(输入绝对值过大时,导数接近 0,影响深层网络训练)

Tanh 是双曲正切函数(Hyperbolic Tangent)的缩写,读音为 /ˈtænh/(英)或 /ˈtæŋ/(近似发音)
作用:将张量元素映射到 (-1, 1) 区间,输出均值为 0,比 Sigmoid 更常用
缺点:同样存在梯度消失问题

rectified ˈrektɪfaɪd 改正的,整流的;精馏过的;调整;矫正;精馏(rectify 的过去分词形式)
作用:保留正元素,将负元素置为 0,计算简单,有效缓解梯度消失,是目前最常用的激活函数之一
缺点:存在 “死亡 ReLU” 问题(某些神经元可能永远输出 0,失去学习能力)

改进:允许负元素有微小输出,解决死亡 ReLU 问题

作用:对张量的某一维度(如最后一维)进行归一化,输出各元素的概率分布(和为 1),常用于多分类问题的输出层
激活函数是神经网络的 “非线性引擎”,通过对张量元素的逐元素变换,赋予模型拟合复杂数据的能力
选择合适的激活函数需结合具体任务(如分类、回归)和网络结构(如深层网络优先选 ReLU 类)
卷积层(Convolutional Layer)
convolutional ˌkɒnvəˈluːʃən(ə)l 卷积的;回旋的;脑回的
stride straɪd 大步,阔步;步态,步伐;步距,步幅;步速;进展,进步;<非正式>裤子(strides);钢琴跨越弹奏法;
大步走,阔步走;跨越,跨过;<文>跨坐在……上,跨立在……上
receptive rɪˈseptɪv(对观点、建议等)愿意倾听的,乐于接受的;能容纳的,可以接受的;(对治疗)反应良好的
卷积层是 CNN 的核心,其作用是通过卷积操作从输入张量中提取局部特征(如边缘、纹理、形状等)
核心原理
输入张量:通常是 4 维张量 (batch_size, height, width, channels)(批量大小、高度、宽度、通道数,如 RGB 图像的通道数为 3)
卷积核(Kernel/Filter):一个小型张量(如 (3, 3, 3),表示 3×3 大小、3 个通道的卷积核),是卷积层的可学习参数
卷积操作:
卷积核在输入张量的空间维度(高度、宽度)上滑动,逐位置与对应区域的张量元素进行元素相乘再求和,得到输出张量的一个元素
这个过程本质是对局部区域的特征进行聚合
例如,用 3×3 卷积核对 5×5 的输入图像(单通道)卷积,输出为 3×3 的特征图(忽略 padding 和步长时)
关键参数
- 步长(Stride):卷积核每次滑动的像素数,步长越大,输出张量尺寸越小
- 填充(Padding):在输入张量边缘填充 0,用于控制输出张量的尺寸(如 “same padding” 保持输出与输入尺寸一致)
- 卷积核数量:决定输出张量的通道数(每个卷积核提取一种特征,输出一个通道)
作用
- 提取局部特征(利用卷积核的局部感受野,Receptive Field)
- 通过参数共享(同一卷积核在整个输入上滑动)减少模型参数,提高效率
- 保留空间相关性(输出张量仍保持输入的空间结构)
为什么说卷积核数量决定输出张量的通道数
假设有一张输入图像,其张量形状为 (1, 5, 5, 3),含义是:
批量大小 = 1(单张图片)
高度 = 5,宽度 = 5(图像尺寸)
通道数 = 3(比如 RGB 彩色图像,红、绿、蓝 3 个通道)
情况 1:使用 1 个卷积核
卷积核的形状需要与输入通道数匹配,因此设为 (3, 3, 3),含义是:
卷积核尺寸 = 3×3(每次滑动覆盖 3×3 的局部区域)
输入通道数 = 3(与输入图像的 3 个通道对应)
卷积操作时,这个 3×3×3 的卷积核会同时对输入图像的 3 个通道(每个通道取 3×3 区域)进行计算(元素相乘后求和,再加上偏置),最终输出1 个通道的特征图
此时输出张量形状为 (1, 3, 3, 1)(假设步长 = 1、无填充,输出尺寸 = 5-3+1=3),通道数 = 1,与卷积核数量一致
情况 2:使用 2 个卷积核
增加 1 个卷积核,即总共有 2 个 (3, 3, 3) 的卷积核(两个卷积核参数不同,学习不同的特征)
第一个卷积核计算后输出 1 个通道的特征图(比如检测 “水平边缘”)
第二个卷积核独立计算(同样对输入的 3 个通道操作),输出另 1 个通道的特征图(比如检测 “垂直边缘”)
最终输出张量形状为 (1, 3, 3, 2),通道数 = 2,等于卷积核的数量
每个卷积核会独立对输入张量的所有通道进行卷积运算,输出1 个通道的特征图
N 个卷积核就会输出 N 个通道的特征图,因此输出张量的通道数 = 卷积核的数量
这也是为什么卷积层通过增加卷积核数量,可以提取更多种类的特征(每个通道对应一种特征类型)
池化层(Pooling Layer)
池化层通常紧跟在卷积层之后,作用是降低张量维度(压缩数据),同时保留重要特征,增强模型平移不变性(对输入的微小位移不敏感)
核心原理
对输入张量的空间维度(高度、宽度)进行局部区域聚合,通过固定规则(如取最大值、平均值)压缩数据
输入通常是卷积层输出的特征张量 (batch_size, height, width, channels),池化操作不改变通道数,只压缩高度和宽度
常见类型:
- 最大池化(Max Pooling):在局部区域(如 2×2)中取最大值作为输出,能突出区域内最显著的特征(如边缘、纹理强度)
- 平均池化(Average Pooling):取局部区域的平均值,能保留区域整体信息,但可能弱化显著特征
关键参数
池化窗口大小:如 2×2(最常用),表示每次聚合 2×2 的区域
步长:通常与窗口大小相同(如 2×2 窗口 + 步长 2,输出尺寸变为输入的 1/2),避免重叠
作用
- 降低数据维度,减少计算量和过拟合风险
- 增强平移不变性(输入微小移动后,池化结果可能不变)
- 进一步提炼卷积层输出的关键特征
Tensor的自注意力机制
mechanism ˈmekənɪzəm 机械装置,机件;途径,方法;(生物体内的)机制,构造;机械论;(产生自然现象等的)物理过程
张量的自注意力机制(Self-Attention Mechanism)
一种让张量(通常是序列数据的张量,如文本、图像补丁序列等)中的元素 “互相关注” 的机制
它通过计算张量内部不同位置元素之间的关联程度(注意力权重),动态调整每个元素的表示,使模型能聚焦于对当前任务更重要的信息
核心思想
对于一个输入张量(例如,文本序列的词向量张量 (batch_size, seq_len, d_model),其中 seq_len 是序列长度,d_model 是每个元素的特征维度),自注意力机制让每个元素(如文本中的每个词)都能 “查看” 序列中其他所有元素,并根据它们之间的相关性(如语义关联)为自己赋予新的特征表示
简单说,每个元素的新表示 = 自身特征与其他所有元素特征的加权和,权重由元素间的相关性决定
具体操作(以序列张量为例):
生成查询、键、值(Q, K, V)对输入张量的每个元素,通过三个可学习的线性变换(矩阵乘法)生成三个向量:
- 查询(Query, Q):表示当前元素 “想要关注什么”
- 键(Key, K):表示其他元素 “能提供什么信息”
- 值(Value, V):表示其他元素 “具体的信息内容”
若输入张量为X ∈ R^(batch_size×seq_len×d_model)(三维实数张量),则:
Q = X·W_Q,K = X·W_K,V = X·W_V(W_Q, W_K, W_V 是可学习参数矩阵)
三个维度的具体含义(以序列数据为例,如文本、时间序列):
batch_size:
表示批量大小,即一次输入模型样本数量
batch_size=32,表示这一批次包含 32 个独立的样本(如 32 句话、32 段音频)
seq_len:
表示序列长度,即每个样本中包含的元素数量(序列的长度)
若处理文本,seq_len=10 可能表示每句话包含 10 个词(或字)
若处理时间序列,可能表示每个样本包含 10 个时间步的观测值
d_model:
表示 “特征维度”,即每个序列元素的特征向量长度(用多少个数字描述一个元素)
d_model=512 表示每个词(或时间步元素)被编码成一个 512 维的向量(包含该元素的语义、属性等信息)
计算注意力权重用每个元素的 Q 与所有元素的 K 进行相似度计算(通常用点积),得到原始注意力分数
再通过 Softmax 归一化,得到权重(和为 1,反映相关性强弱):
- 权重矩阵
Attention(Q,K) = Softmax( (Q·K^T) / √d_k ),其中√d_k是缩放因子(避免分数过大导致 Softmax 梯度消失)(K^T表示K 的转置) - 加权求和得到输出用归一化后的权重对所有元素的 V 进行加权求和,得到每个元素的新表示(输出张量):
Output = Attention(Q,K) · V
为什么作用于 “张量”?
输入通常是高维张量(如 (batch, seq_len, d_model) 或图像补丁的 (batch, num_patches, d_model))
Q、K、V 也是同形状的张量;
- 注意力计算是在张量的序列维度(seq_len 或 num_patches)上进行的,本质是对张量中 “元素间关系” 的建模
- 输出仍是同结构的张量,只是每个元素的特征已融合了其他相关元素的信息
作用与优势
捕捉长距离依赖:相比卷积的局部感受野,自注意力能直接计算任意两个元素的关联(如文本中跨句子的词关联)
动态权重:不同输入张量的注意力权重不同,模型能自适应聚焦关键信息(如翻译时 “猫” 更关注 “爪子” 而非 “天空”)
并行计算:注意力权重的计算可并行处理(对比循环神经网络的串行依赖),适合大规模数据
举例
在文本 “猫追老鼠,老鼠跑很快” 中:
输入张量是 6 个词的词向量(seq_len=6);
- “猫” 的 Q 与 “追”、“老鼠” 的 K 相似度高,权重更大
- “老鼠” 的 Q 与 “猫”、“追”、“跑” 的 K 相似度高
输出张量中
- “猫” 的新表示会重点融合 “追”、“老鼠” 的信息
- “老鼠” 的新表示会重点融合 “猫”、“追”、“跑” 的信息
从而更准确表达语义关联
自注意力是 Transformer 模型核心,已广泛用于 NLP(如 BERT、GPT)、计算机视觉(如 ViT)等领域,成为处理高维张量序列重要工具
“猫 追 老鼠”,将其编码为张量 X,具体参数如下:
batch_size=1(仅 1 个文本样本)
seq_len=3(3 个词:“猫”“追”“老鼠”)
d_model=4(每个词用 4 维向量表示,例如通过词嵌入得到)
因此,输入张量 X 的形状是 (1, 3, 4),具体数值(仅为示例):
X = [
[
[0.1, 0.2, 0.3, 0.4], # “猫”的词向量
[0.5, 0.6, 0.7, 0.8], # “追”的词向量
[0.9, 1.0, 1.1, 1.2] # “老鼠”的词向量
]
]
步骤 1:生成查询(Q)、键(K)、值(V)
需要三个可学习的参数矩阵 W_Q, W_K, W_V,假设它们的形状都是 (4, 3)(输入维度d_model=4,输出维度3,可自定义):
W_Q = [[0.1, 0.2, 0.3],
[0.4, 0.5, 0.6],
[0.7, 0.8, 0.9],
[1.0, 1.1, 1.2]]
W_K = [[0.2, 0.3, 0.4],
[0.5, 0.6, 0.7],
[0.8, 0.9, 1.0],
[1.1, 1.2, 1.3]]
W_V = [[0.3, 0.4, 0.5],
[0.6, 0.7, 0.8],
[0.9, 1.0, 1.1],
[1.2, 1.3, 1.4]]
对 X 分别进行矩阵乘法,得到 Q, K, V:
Q = X · W_Q:形状为 (1, 3, 3)
Q = [
[
[0.1×0.1 + 0.2×0.4 + 0.3×0.7 + 0.4×1.0, ... , 0.1×0.3 + 0.2×0.6 + 0.3×0.9 + 0.4×1.2], # “猫”的Q向量
[0.5×0.1 + 0.6×0.4 + 0.7×0.7 + 0.8×1.0, ... , 0.5×0.3 + 0.6×0.6 + 0.7×0.9 + 0.8×1.2], # “追”的Q向量
[0.9×0.1 + 1.0×0.4 + 1.1×0.7 + 1.2×1.0, ... , 0.9×0.3 + 1.0×0.6 + 1.1×0.9 + 1.2×1.2] # “老鼠”的Q向量
]
]
# 简化后(仅示例数值):
Q = [
[
[1.0, 1.1, 1.2],
[2.0, 2.1, 2.2],
[3.0, 3.1, 3.2]
]
]
K = X · W_K:形状为 (1, 3, 3)
K = [
[
[1.2, 1.3, 1.4],
[2.2, 2.3, 2.4],
[3.2, 3.3, 3.4]
]
]
V = X · W_V:形状为 (1, 3, 3)
V = [
[
[1.4, 1.5, 1.6],
[2.4, 2.5, 2.6],
[3.4, 3.5, 3.6]
]
]
步骤 2:计算注意力权重
首先计算 Q 与 K^T(K 的转置)的点积,再除以缩放因子 √d_k(这里 d_k=3,所以 √3≈1.732):
Q·K^T 的形状是 (1, 3, 3)(每个元素是 Q 中某行与 K 中某列的点积):
Q·K^T = [
[
[1.0×1.2 + 1.1×1.3 + 1.2×1.4, 1.0×2.2 + 1.1×2.3 + 1.2×2.4, 1.0×3.2 + 1.1×3.3 + 1.2×3.4],
[2.0×1.2 + 2.1×1.3 + 2.2×1.4, 2.0×2.2 + 2.1×2.3 + 2.2×2.4, 2.0×3.2 + 2.1×3.3 + 2.2×3.4],
[3.0×1.2 + 3.1×1.3 + 3.2×1.4, 3.0×2.2 + 3.1×2.3 + 3.2×2.4, 3.0×3.2 + 3.1×3.3 + 3.2×3.4]
]
]
# 简化后(仅示例数值):
Q·K^T = [
[
[4.35, 8.86, 13.37],
[8.70, 17.72, 26.74],
[13.05, 26.58, 40.11]
]
]
除以 √3≈1.732 后:
(Q·K^T)/√d_k ≈ [
[
[2.51, 5.12, 7.72],
[5.02, 10.23, 15.43],
[7.53, 15.35, 23.15]
]
]
通过 Softmax 归一化(使每行和为 1),得到注意力权重矩阵 Attention(Q,K):
Attention(Q,K) ≈ [
[
[0.0, 0.0, 1.0], # “猫”对三个词的权重(更关注“老鼠”)
[0.0, 0.0, 1.0], # “追”对三个词的权重(更关注“老鼠”)
[0.0, 0.0, 1.0] # “老鼠”对三个词的权重(更关注自己)
]
]
# 注:实际Softmax计算中,数值差异会更细腻,这里为了简化突出逻辑
步骤 3:加权求和得到输出
用 Attention(Q,K) 与 V 相乘,得到输出张量 Output:
Output = Attention(Q,K) · V ≈ [
[
[0.0×1.4 + 0.0×2.4 + 1.0×3.4, 0.0×1.5 + 0.0×2.5 + 1.0×3.5, 0.0×1.6 + 0.0×2.6 + 1.0×3.6],
[0.0×1.4 + 0.0×2.4 + 1.0×3.4, 0.0×1.5 + 0.0×2.5 + 1.0×3.5, 0.0×1.6 + 0.0×2.6 + 1.0×3.6],
[0.0×1.4 + 0.0×2.4 + 1.0×3.4, 0.0×1.5 + 0.0×2.5 + 1.0×3.5, 0.0×1.6 + 0.0×2.6 + 1.0×3.6]
]
]
# 即:
Output = [
[
[3.4, 3.5, 3.6],
[3.4, 3.5, 3.6],
[3.4, 3.5, 3.6]
]
]
三个词的输出表示都重点融合了 “老鼠” 的信息(因为注意力权重显示它们对 “老鼠” 的关注度最高)。
这符合语义逻辑:“猫” 和 “追” 的核心关联对象是 “老鼠”,因此自注意力机制通过权重计算自动捕捉到了这种长距离依赖
通过这个例子,可以清晰看到自注意力机制如何让张量中的元素 “互相关注”,并生成融合关键信息的新表示
4754

被折叠的 条评论
为什么被折叠?



