Keras入门笔记(番一):从源码分析K.batch_dot及与dot的区别

这篇博客探讨了Keras中`batch_dot`函数与`dot`的区别,强调了`batch_dot`在处理批样本维度时的优化。文章通过源码分析解释了`batch_dot`并非真正的点积,而是一种自定义维度的逐元素乘法,特别适合深度学习场景中的特定计算。此外,博客还讨论了不同维度向量和矩阵的乘法规则及其在各种计算环境中的不同命名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动机

矩阵和向量的乘法各种名称都有,甚至相互混杂,在不同框架里的命名也不一样,每每都会陷入这些Magic中。例如,同样是dot对向量shape= (n,)和一维张量shape=(n,1)而言都不一样,无论总结过多少次,像我们这种torch和tensowflow、matlab轮着写的人,总是不经意间就会翻车。

好在keras提供了高级的接口,至少在tensorflow、theano以及可能会有的mxnet上的表现是一致的。

各种向量乘法的命名

我个人非常烦什么“点积、外积、内积、点乘、叉乘、直积、向量积、张量积”的说法,乱的不行。我觉得,还是应该统一一下,别一会儿点积一会儿点乘,二维一维都不区分,非常容易乱。由于中文教材各种翻译都有,因此主要还是用wiki作为统一吧。

一维(向量)
  • 需要注意的是,shape=(n, )的才是一维向量,shape(n,1)已经变成张量了。
  1. Dot product
    在这里插入图片描述
import numpy as np
a = np.array([1,2,3,4,5])  # 向量,不区分列向量或行向量。应该视为列向量。
b = a.reshape((5,1))  # 张量
print(a.shape, b.shape, a.T.shape)  # (5,) (5, 1) (5,)
print((a+b).shape)  # (5, 5)
print(np.dot(a,a), a*a)  # 55 [1 4 9 16 25]
print(np.dot(b.T,b))  # [[55]]
# Also, a*a = np.multiply(a, a), b*b = np.multiply(b, b)
  1. Cross product

构建神经网络时基本不用,仅在工程优化中大量使用,如共轭梯度等。API一般为cross(a, b)。

在这里插入图片描述

  1. element-wise

逐元素乘法,也就是 Dot product 不进行求和: c i = a i b i c_i=a_ib_i ci=aibiAPI一般为multiply(a, b)

二维(矩阵)
  1. Hadamard product

常说的对应元素逐元素相乘。也是element-wise的一种。API一般是multiply(a, b)

在这里插入图片描述

### Transformer模型简介 Transformer是种由Google研究团队于2017年提出的新型神经网络架构[^1]。该架构摒弃了传统的循环神经网络(RNN)和卷积神经网络(CNN),转而完全依赖自注意力机制(self-attention mechanism)来处理序列数据。 #### 自注意力机制解析 在传统RNN结构中,输入的数据按顺序依次传递给下个时间步,在这种情况下,距离较远的信息可能会逐渐衰减。而在Transformer中引入的自注意力机制允许每个位置其他位置关联起来,从而更好地捕捉全局信息。具体来说,对于任意时刻t的位置i,它能够关注到整个句子中的所有单词j,并计算它们之间的权重系数wij,这些权重决定了哪些部分应该被赋予更多的重要性[^2]。 ```python import numpy as np def scaled_dot_product_attention(q, k, v): matmul_qk = np.matmul(q, k.T) dk = q.shape[-1] logits = matmul_qk / np.sqrt(dk) attention_weights = softmax(logits, axis=-1) output = np.matmul(attention_weights, v) return output, attention_weights ``` #### 编码器解码器结构 Transformer整体上分为编码器(encoder)和解码器(decoder)两大部分。每层都包含了多个子层(sub-layer),其中最重要的是多头注意力(multi-head attention)模块以及前馈全连接(feed-forward fully connected network)。通过堆叠若干这样的层次可以构建出强大的特征提取能力。 ##### 多头注意力实现示例: ```python class MultiHeadAttention(tf.keras.layers.Layer): def __init__(self, d_model, num_heads): super(MultiHeadAttention, self).__init__() assert d_model % num_heads == 0 self.depth = d_model // num_heads self.num_heads = num_heads self.wq = tf.keras.layers.Dense(d_model) self.wk = tf.keras.layers.Dense(d_model) self.wv = tf.keras.layers.Dense(d_model) self.dense = tf.keras.layers.Dense(d_model) def split_heads(self, x, batch_size): """Split the last dimension into (num_heads, depth).""" x = tf.reshape(x, (batch_size, -1, self.num_heads, self.depth)) return tf.transpose(x, perm=[0, 2, 1, 3]) def call(self, v, k, q, mask=None): batch_size = tf.shape(q)[0] q = self.wq(q) # (batch_size, seq_len, d_model) k = self.wk(k) # (batch_size, seq_len, d_model) v = self.wv(v) # (batch_size, seq_len, d_model) q = self.split_heads(q, batch_size) # (batch_size, num_heads, seq_len_q, depth) k = self.split_heads(k, batch_size) # (batch_size, num_heads, seq_len_k, depth) v = self.split_heads(v, batch_size) # (batch_size, num_heads, seq_len_v, depth) scaled_attention, _ = scaled_dot_product_attention( q, k, v, mask) scaled_attention = tf.transpose(scaled_attention, perm=[0, 2, 1, 3]) concat_attention = tf.reshape(scaled_attention, (batch_size, -1, self.d_model)) output = self.dense(concat_attention) # (batch_size, seq_len_q, d_model) return output ``` #### 应用场景发展前景 由于其出色的性能表现,Transformers已经被广泛应用于自然语言处理(NLP)领域内的诸多任务当中,比如机器翻译、文本摘要生成等。除此之外,在计算机视觉方面也有着不俗的表现,例如图像分类、目标检测等领域也开始尝试采用类似的思路来进行改进和发展[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值