利用cython进行编译成库.
1. setup.py
1 | # coding: utf-8 |
2. build
1 | python setup.py build_ext --inplace |
3. 结论
通过这种方式编译成一个库,正常情况下无法查看源码。
在开发过程中,IDE无法自动导入,就正常打包方便开发同学调试、使用,而在生产环境使用2
方式进行编译成一个安装包,开发替换一下安装包路径即可。
利用cython进行编译成库.
1 | # coding: utf-8 |
1 | python setup.py build_ext --inplace |
通过这种方式编译成一个库,正常情况下无法查看源码。
在开发过程中,IDE无法自动导入,就正常打包方便开发同学调试、使用,而在生产环境使用2
方式进行编译成一个安装包,开发替换一下安装包路径即可。
在keras中,比如动态调整学习率,可以:
1 |
|
在pytorch中,提供了torch.optim.lr_scheduler
1 | # -*- coding: utf8 -*- |
1 |
|
这个可以设置区间,在30 ~ 80
为一个学习率
1 | scheduler = lr_scheduler.ExponentialLR(optimizer, gamma=0.9) |
指数衰减
在transformers库中,也提供了一些,比如:
学习率预热
1 | num_warmup_steps = 0.05 * len(train_dataloader) * epochs |
1 | optimizer = optim.Adam(params=model.parameters(), lr=1e-3) |
学习率先不断上升,然后再不断减小。
在预热期间,学习率从0线性增加到优化器中的初始lr。随后线性降低到0
在数据处理里,常使用DataSet和DataLoader,关于具体使用此处不介绍,对于每一个batch_size里的数据来讲,
一般数据是shuffle=True
,即表示打乱顺序,能够使数据更无规律和更为随机。但是如果对于数据样本不定长的情况或者说分布不均匀的情况下,
要使其定长,做法就是pad到一个固定长度,如果长短分布差距大呢??
比如:
1 | example1: 我有一个小摩托,我从来也不急,骑着我的小摩托,从此把它骑。 |
如果将example2
和example1
pad到一个固定长度,pad太多。(虽然你可以扯进来mask,但是要在model的每一layer都要设置mask,关于mask此处忽略。)
如何在一个batch_size样本里面使数据分布更为接近?
kmean algo for clustering the feature by length.
kmeans等聚类算法就可以辅助解决,以每条数据的长度为依据。
1 |
|
这样使用的话,那么batch_size就木有啥子用处了,有可能一个batch样本量为1,也有可能为设置的上限。
但是转念一想,其实也可以不用如此复杂,直接sorted by length也是可以的嘛,具体解释就忽略了。
图像常见数据增强有翻转,旋转,缩放比例等不同的transforms。
对于文本,可以增加噪声干扰,也可以通过添加slide window(此处重点,嘿嘿。)
举个简单例子描述下滑动窗口。
1 | a = [1,2,3,4,5] |
但是在某些训练结果下,其作用貌似并不大,反正可以尝试。
这个方式来自HanLP,具体就不细讲了,大家看代码即可。
1 |
|
1 | # -*- coding: utf8 -*- |
第二篇文章,通过一种新的方式来实现以首字表示词向量
也可以看这里:一些mask的操作理解 gather部分。
1 |
|
1 |
|
output:
1 | tensor([[[ 101, 0, 0], |
1 |
|
到此,能够拿到以词为级别的output,embed.shape查看一下即可,后续就可以concat其他input做多输入。
这里以BertForMaskedLM为例,记录下BertModel的网络结构和一些思考,cls那部分网络结构不涉及,即BertOnlyMLMHead那部分。
1 | BertForMaskedLM( |
transformer里面的positional embedding,是正余弦绝对位置编码,对于sequence分配不同的position id。而bert是学习出来的,分配一个(512,768)embedding。
随后word_embedding,positional embedding, token_type_embedding进行相加,然后经过LN、dropout获得最终embedding。
在transformer结构里,是没有这个中间层
的,细看下,是将768扩大4倍,随后在BertOutput那里又降维到768。那bert加这一个linear的作用是干嘛的呢?
搜了下网上的看法,很少关注或者没有相关思考。但是这这篇论文:Undivided Attention: Are Intermediate Layers Necessary for BERT? 给出了自己的解释。作者观点如下:
1 | In recent times, BERT-based models have been extremely successful in solving a variety of natural language processing (NLP) tasks such as reading comprehension, natural language inference, sentiment analysis, etc. All BERT-based architectures have a self-attention block followed by a block of intermediate layers as the basic building component. However, a strong justification for the inclusion of these intermediate layers remains missing in the literature. In this work we investigate the importance of intermediate layers on the overall network performance of downstream tasks. We show that reducing the number of intermediate layers and modifying the architecture for BERT-Base results in minimal loss in fine-tuning accuracy for downstream tasks while decreasing the number of parameters and training time of the model. Additionally, we use the central kernel alignment (CKA) similarity metric and probing classifiers to demonstrate that removing intermediate layers has little impact on the learned self-attention representations. |
结论就是实验后发现降低网络复杂度后,同时也能保持微调任务的准确性。
之前在看mask language model时,如何做数据处理那里一直没有太本质理解,比如15%做mask,然后又80%做mask,10%不变,10%随机选择,所以这里将mlm数据处理部分的代码列出来,方便需要者可以看到bert是怎么实现的。
另外关于mlm分词wordpience还是整词甚者ngram,这里不做探讨,本质来讲就是数据处理的方式不同,其他对于训练和上游使用预训练模型来讲并不影响。
1 | import collections |
从测试代码可以看到:
10
,以embedding出来为准,输出维度为: (32, 3, 30)
rnn第一步初始化hx(10, 32, 4),一共初始化了num_layer=10层,batch_size=32,hidden_size=4,白话文就是每一层rnn都有一个(32, 4)的矩阵来保存最后一个时刻(ht)的结果。
这个可以看class RNNBase(Module):
。
另外还有2个weight,2个bias的初始化。即公式中的w
和b
初始化参数后,调用此方法,进行rnn计算,如果支持GPU,就会使用cudnn提供好的,此处忽略这里。
1 | def AutogradRNN(mode, input_size, hidden_size, num_layers=1, batch_first=False, |
1 |
|
1 | def Recurrent(inner, reverse=False): |
1 | # 针对rnn |
1 | # -*- coding: utf8 -*- |
至此,前向过程完结。
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true
2025-02-28
#算法
2025-02-08
#算法
2024-09-02
#算法
2024-08-19
#算法
2024-07-15
#算法
2024-06-20
#算法
2024-06-19
#算法
2024-05-08
#算法
2024-05-07
#算法
2024-04-26
#算法
2024-04-24
#算法
2024-04-07
#算法
2023-12-21
#算法
2023-11-29
#算法
2023-10-31
#算法
2023-10-16
#算法
2023-10-11
#算法
2023-10-01
#算法
2023-08-25
#算法
2023-05-04
#python
2023-04-10
#算法
2023-03-07
#算法
2023-03-07
#算法
2023-02-13
#算法
2023-01-06
#算法
2022-12-12
#算法
2022-11-18
#算法
2022-11-14
#算法
2022-11-02
#算法
2022-09-28
#算法
2022-09-07
#算法
2022-08-18
#算法
2022-08-18
#算法
2022-08-17
#算法
2022-08-17
#算法
2022-08-12
#算法
2022-08-09
#算法
2022-08-08
#算法
2022-08-05
#算法
2022-07-29
#算法
2022-05-23
#算法
2022-05-17
#python
2022-04-21
#算法
2022-04-01
#算法
2022-03-14
#算法
2022-03-10
#算法
2022-02-23
#算法
2022-01-12
#算法
2022-01-05
#算法
2021-12-30
#算法
2021-12-29
#算法
2021-12-29
#算法
2021-12-28
#算法
2021-12-28
#算法
2021-12-24
#算法
2021-12-24
#算法
2021-12-24
#算法
2021-12-24
#算法
2021-12-22
#算法
2021-12-22
#算法
2021-12-17
#算法
2021-12-16
#算法
2021-11-15
#算法
2021-11-12
#算法
2021-11-02
#算法
2021-10-30
#算法
2021-10-30
#算法
2021-10-30
#算法
2021-10-28
#算法
2021-10-16
#算法
2021-10-15
#算法
2021-10-15
#算法
2021-10-05
#算法
2021-09-27
#算法
2021-09-02
2021-08-20
#算法
2021-08-13
#算法
2021-07-23
#小桥流水人家
2021-07-22
#linux
2021-07-20
#算法
2021-07-14
#python
2021-07-02
#算法
2021-06-28
#算法
2021-06-28
#算法
2021-06-25
#算法
2021-06-25
#算法
2021-06-25
#算法
2021-06-23
#算法
2021-06-23
#算法
2021-06-19
#算法
2020-06-18
#算法
2020-06-16
#算法
2020-06-10
#算法
2020-03-09
#python
2020-02-29
#小桥流水人家
2020-02-20
#算法
2020-01-19
#小桥流水人家
2020-01-10
#算法
2019-12-26
#python
2019-11-19
#小桥流水人家
2019-10-21
#MySQL
2019-06-28
#python
2019-06-08
#flutter
2019-05-18
#MySQL
2019-04-13
#机器学习
2019-03-20
#python
2018-12-06
#小桥流水人家
2018-11-05
#小桥流水人家
2018-10-04
#小桥流水人家
2018-09-26
#machine learning
2018-09-21
#machine learning
2018-09-04
#linux
2018-09-02
#小桥流水人家
2018-07-13
#python
2018-06-29
#python
2018-06-19
#python
2018-05-25
#python
2018-04-20
#SQLAlchemy
2018-04-17
#python
2018-04-16
#python
2018-04-14
#SQLAlchemy
2018-04-11
#python
2018-04-10
#MySQL
2018-04-10
#SQLAlchemy
2018-04-06
#SQLAlchemy
2018-03-26
#SQLAlchemy
2018-03-25
#python
2018-03-22
#SQLAlchemy
2018-03-22
#python
2018-03-20
#SQLAlchemy
2018-03-19
#SQLAlchemy
2018-02-27
#python
2018-01-22
#python
2017-12-26
#技术
2017-12-05
#python
2017-11-29
#CI
2017-10-02
#grpc
2017-10-01
#grpc
2017-09-26
#grpc
2017-08-26
#go
2017-07-28
#linux
2017-07-28
#CI
2017-06-30
#python
2017-05-26
#python
2017-05-21
#python
2017-05-10
#python
2017-03-26
#python
2017-03-22
#git
2016-08-24
#linux
2016-03-04
#MySQL
2016-02-27
#linux
2016-02-05
#linux
2016-01-29
#linux
2016-01-02
#linux
2015-11-22
#python
2015-10-31
#linux
2015-10-30
#linux
2015-10-30
#linux
2015-10-30
#linux
2015-10-29
#linux
2015-10-29
#linux
2015-10-29
#linux
2015-10-29
#linux
2015-10-10
#linux
2015-10-06
#linux
2015-10-03
#MySQL
2015-10-03
#MySQL
2015-10-02
#MySQL
2015-10-02
#MySQL
2015-10-02
#MySQL
2015-09-30
#linux
2015-09-30
#linux
2015-09-29
#linux
2015-09-29
#linux
2015-09-29
#linux
2015-09-29
#linux
2015-09-26
#linux
2015-09-26
#linux
2015-09-22
#linux
2015-09-20
#linux
2015-09-20
#linux
2015-09-19
#linux
2015-08-31
#linux
2015-07-06
#MySQL
2015-07-06
#MySQL
2015-07-06
#MySQL
2015-07-06
#MySQL
2015-07-06
#MySQL
2015-07-06
#MySQL
2015-07-06
#MySQL
2015-07-06
#MySQL
2015-07-06
#MySQL
2015-07-06
#MySQL
2015-07-06
#MySQL
2015-05-14
#linux
2015-05-10
#linux
2015-05-10
#linux
2015-05-07
#linux
2015-05-04
#linux
2015-05-04
#linux
2015-05-04
#linux
2015-04-28
#linux
2015-04-23
#linux
2015-04-22
#linux
2015-04-22
#linux
2015-04-22
#linux
2015-04-22
#MySQL
2015-04-22
#linux
2015-04-22
#linux
2015-04-22
#MySQL
2015-04-22
#MySQL
2015-04-22
#linux
2015-04-22
#linux
2015-04-22
#linux
2015-04-21
#linux
2015-04-05
#linux
2015-04-05
#linux
2015-04-04
#linux
2015-04-03
#linux
2015-04-03
#linux
2015-04-03
#linux
2015-04-03
#linux
2015-04-02
#linux
2015-03-28
#linux
2015-03-27
#linux
2015-03-27
#linux
2015-03-27
#linux
2015-03-26
#linux
2015-03-25
#linux
2015-03-25
#linux
2015-03-24
#linux
2015-03-22
#linux
2015-03-22
#linux
2015-03-22
#linux
2015-03-22
#linux
2015-03-21
#linux
2015-03-20
#linux
2015-03-19
#linux
2015-03-19
#linux
2015-03-15
#linux
2015-03-15
#linux
2015-03-15
#linux
2015-03-14
#linux
2015-03-13
#linux
2015-03-02
#linux
2015-02-26
#linux
2015-02-25
#linux
2015-02-25
#linux
2015-02-24
#linux
2015-02-22
#linux
2015-02-22
#linux
2015-02-22
#linux
2015-02-21
#linux
2015-02-21
#linux
2015-02-16
#linux
2015-02-15
#linux
2015-02-14
#linux
2015-02-14
#linux
2015-02-14
#linux
2015-02-13
#linux
2015-02-13
#linux
2015-02-13
#linux
2015-02-12
#linux
2015-02-12
#linux
2015-02-11
#linux
2015-02-11
#linux
2015-02-10
#linux
2015-02-09
#linux
2015-02-09
#linux
2015-02-08
#linux
2015-02-08
#linux
2015-02-06
#linux
2015-02-05
#linux