2021-11-02

[软件工程应用与实践]lingvo学习笔记

2021SC@SDUSC

beam search

  • 保存最好的k个候选

  • 在每个时刻, 对每个候选项新加一项(n个可能), 在kn个选项中选择最好的k个
    beam search原理图

  • 时间复杂度O(knT)

  • 每个候选的最终分数是:
    (1 / Lα)logp(y1, … , yL) = (1 / Lα)Σlogp(yt’|y1, … , yt’-1)

    • 通常 α = 0.75
  • 当 k = 1 时是贪心搜索

  • 当 k = n 时是穷举搜索

注意力机制

  • 卷积、全连接、池化层都只考虑不随意线索
  • 注意力机制显示的考虑随意线索
    • 随意线索被称为***查询***(query)
    • 每个输入是一个***值***(value)和***不随意线索***(key)的对
    • 通过注意力池化层来有偏向性的选择某些输入(根据query)
      attention笔记
      非参注意力池化层
  • 给定数据 (xi, yi), i = 1, … , n
  • 平均池化是最简单的方案 : f(x) = (1/n)Σyi
    • x : query
    • (xi, yi) : 键值对
  • Nadaraya-Watson核回归
    f(x) = Σyi(K(x - xi)/(ΣK(x - xj))
    • x : query
    • xj : key
    • yi : value
  • 与KNN相近
  • 使用高斯核
    Nadaraya-Watson核回归公式推导
    参数化的注意力机制
  • 在非参数化注意力机制上引入可以学习的w
    公式

总结
注意力机制中,通过 query 和 key 来有偏向性的选择输入

  • 可以一般的写作 f(x) = Σα(x, xi)yi,这里α(x, xi)是注意力权重

注意力分数

在这里插入图片描述
注意力机制在做什么?

将key value拓展到高维度
  • 假设 query q ∈ Rq, m 对 key-value (k1, v1), …,这里 ki ∈ Rkvi ∈ Rv
  • 注意力池化层:
    在这里插入图片描述
  • 设计 a
    • 可加
      • 可学参数:
        Wk ∈ R^hxk, Wq ∈ Rhxq, v ∈ Rh
        a(k, q) = vTtanh(Wkk + Wqq)
      • 等价于将 key 和 query 合并起来后放入到一个隐藏大小为 h , 输出大小为 1 的单隐藏层MLP
    • 标准化点积
      • 如果 query 和 key 都是同样的长度 q, ki ∈ Rd, 那么可以 a(q, ki) = <q, ki>/d1/2
      • 向量化版本
        • Q ∈ Rnxd, K ∈ Rmxd, V ∈ Rmxv
        • 注意力分数 : a(Q, K) = QKT/d1/2 ∈ Rnxm
        • 注意力池化 : f = softmax(a(Q, K))V ∈ Rnxv

总结

  • 注意力分数是 query 和 key 的相似度, 注意力权重是分数的 softmax 结果
  • 常见的分数计算 :
    • 将 query 和 key 合并起来进入一个单输出单隐藏层的MLP
    • 直接将 query 和 key 做内积
seq2seq

动机

  • 机器翻译中, 每个生成的词可能相关与源句子中不同的词
    只用了最后词的隐藏状态, 前面的输入被遗忘
  • seq2seq模型不能对此直接建模

加入注意力

  • 编码器对每次词的输出作为 key 和 value
  • 解码器 RNN 对上一个词的输出是 query
  • 注意力的输出和下一个词的词嵌入合并进入decoder

总结

  • Seq2Seq中通过隐藏状态在编码器和解码器中传递信息
  • 注意力机制可以根据解码器RNN的输出来匹配到合适的编码器RNN的输出来更有效的传递信息

lingvo 中的注意力机制 :
performer
这是一种具有可线性扩展注意力机制的 Transformer 架构,可以加快训练速度,同时允许模型处理更长的长度,从而满足某些图像数据集(如 ImageNet64)和文本数据集(如 PG-19)的训练需求。Performer 使用了高效(线性)的广义注意力框架,可支持使用基于不同相似性度量(内核)的多种注意力机制。我们使用了新的通过正正交随机特征获得快速注意力 (FAVOR+) 算法来实现这一框架。该算法为注意力机制提供了可扩展的低方差和无偏估计 ,并可通过随机特征图分解来表示(具体来说,就是常规的 softmax-attention)。在保持了线性的空间和时间复杂度的情况下,该方法还确保了良好的准确率,并且可以应用到独立的 softmax 运算。

lingvo 组件 :
lingvo.core.favor_attention module

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生产者消费者问题是一个经典的同步问题,其中生产者和消费者共享一个缓冲区,生产者向缓冲区中生产产品,消费者从缓冲区中消费产品。在多线程的环境下,生产者和消费者可能会同时访问缓冲区,因此需要对缓冲区进行同步控制。 以下是一个简单的生产者消费者问题的实现: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> #define BUFFER_SIZE 10 int buffer[BUFFER_SIZE]; int count = 0; int in = 0; int out = 0; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t empty = PTHREAD_COND_INITIALIZER; pthread_cond_t full = PTHREAD_COND_INITIALIZER; void *producer(void *arg) { int i; for (i = 0; i < 20; i++) { pthread_mutex_lock(&mutex); while (count == BUFFER_SIZE) { pthread_cond_wait(&empty, &mutex); } buffer[in] = i; in = (in + 1) % BUFFER_SIZE; count++; printf("producer: produced %d\n", i); pthread_cond_signal(&full); pthread_mutex_unlock(&mutex); } pthread_exit(NULL); } void *consumer(void *arg) { int i, data; for (i = 0; i < 20; i++) { pthread_mutex_lock(&mutex); while (count == 0) { pthread_cond_wait(&full, &mutex); } data = buffer[out]; out = (out + 1) % BUFFER_SIZE; count--; printf("consumer: consumed %d\n", data); pthread_cond_signal(&empty); pthread_mutex_unlock(&mutex); } pthread_exit(NULL); } int main() { pthread_t tid1, tid2; pthread_create(&tid1, NULL, producer, NULL); pthread_create(&tid2, NULL, consumer, NULL); pthread_join(tid1, NULL); pthread_join(tid2, NULL); return 0; } ``` 在代码中,我们定义了一个大小为10的缓冲区,使用一个计数器count来记录缓冲区中产品的数量,in和out分别表示生产者和消费者在缓冲区中的位置。我们使用了两个条件变量empty和full来控制生产者消费者的同步。 在生产者中,当缓冲区已满时,生产者会等待empty条件变量,直到缓冲区有空位。当生产者生产完一个产品后,会唤醒消费者,并释放互斥锁。 在消费者中,当缓冲区为空时,消费者会等待full条件变量,直到缓冲区有产品。当消费者消费完一个产品后,会唤醒生产者,并释放互斥锁。 通过使用互斥锁和条件变量,我们可以保证生产者和消费者的正确同步,避免了竞争条件和死锁等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值