深度学习问题bug

20200727

‘\x02’

特殊字符和空格效果相同 但不是空格

Weights of BertForTokenClassification not initialized from pretrained model: [‘classifier.weight’, ‘classifier.bias’]
Weights from pretrained model not used in BertForTokenClassification: [‘cls.predictions.bias’, ‘cls.predictions.transform.dense.weight’,

第一个问题是指 现在代码构建的两个参数,加载的模型里面不存在 取决于下游具体的应用
第二个问题是指 从加载模型里面含有的参数 现在构建的模型并没有使用 不存在对应的参数
20200608

RuntimeError: Function AddBackward0 returned an invalid gradient at index 1 - expected type torch.cuda.FloatTensor but got torch.FloatTensor

这种问题,就是数据没有放进gpu造成的,一般加.cuda()可以解决

RuntimeError: expected device cuda:0 and dtype Byte but got device cuda:0 and dtype Bool

出现该错误的原因是torch版本不对,我的解决方法是将torch1.2.0降至1.1.0。

RuntimeError: Expected object of backend CUDA but got backend CPU for argument #4 ‘mat1’
原因:变量没有加cuda
data=data.cuda()

20200316
大数据:大量数据
云计算:通过分布式,虚拟化,云化,弹性获得资源

大数据,云计算,人工智能
https://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEwNg==&mid=2650766268&idx=1&sn=1e95084195cfe61ba4061d9caec0f631&chksm=f3f9ce29c48e473f9fa4b91623d33a3e6049db26e0f14433a97531efa76290b617de0f9fe213&mpshare=1&scene=24&srcid=0314DDj5byHIB72sn3z0Pe5X&key=f898ff0119c1ac72e3096c14490d5a3388b476f81d6a4998b951ef0a0feea242de17c437d651e179cc979c0396ba772b4b42183f27c112571ee9c05c75746d2780e1b48243a520edafb23d012896b3dc&ascene=1&uin=MTk0ODYwODI2Mg%3D%3D&devicetype=Windows+10&version=62080079&lang=zh_CN&exportkey=AfwCy0Qcu6X7a9Ed9Hkjt14%3D&pass_ticket=FebHNJi5Bs9koG%2BcWaTAR04N5HoSZqQ7A5jqZTx9y%2Bk2s1PHE27yQV5tQXkyQU7d

20200306

解决ValueError: Expected n_neighbors <= n_samples, but n_samples = 4, n_neighbors = 5

类别少的样本个数小于 n_neighbors = 5 这里的参数值

https://www.cnblogs.com/sunbigdata/p/8697729.html
生成样本集

20200227
提高深度学习网络准确度
1.nn.linear(m,n) n 对应最后的分类数目
m 最好是n 的倍数
2.增加层次可以
3.通道数逐渐加倍
深度学习问题bug_第1张图片

https://www.cnblogs.com/adong7639/p/7905121.html
max_pool2D函数

    output[1 20 10 10]
    out = out.view(in_size, -1)
    -1 把后面三个维度都乘起来了

    self.conv1=nn.Conv2d(1,10,5) # 10, 24x24
    第一个参数为输入通道1
    第二个参数为输出通道10  相当于10个卷积核 
    第三个参数为 卷积核 5x5

计算公式
out_size = (n - k + 2p)/s + 1
输入图片大小为n x n,卷积核kernel_size大小为k x k,步长stride为s,填充padding为p('same’为填充那么P就为1,否则就为0),得到输出特征图out_size大小
padding 为1 表示图片的周围都增加一格 相当于 nxn 变成
(n+2)*(n+2) 但公式还是以n为计算基础
padding 为零 则没有增加

卷积计算
深度学习问题bug_第2张图片
卷积核计算公式

深度学习问题bug_第3张图片
池化计算

nn.Conv2d
通道有时候可以理解为卷积核数目?
在这里插入图片描述
隐藏层就是中间层?

深度学习加速方法:

1.还有是可以降低数据的精度,例如fp16和int8精度
2.tensorRT(分布式) 百度飞桨要先转成ONNX才可以用
3.TVM(分布式)可以实现CPU加速 算法融合,减少IO时间实现加速
数据经过网络内部的每一层都会有一次IO时间,经过层与层的融合可以大大减少IO时间从而实现加速 加速工具可以进行网络内部层与层的融合
4.网络剪枝 剪枝完用TVM,这个可以实现3倍左右的加速吧
5.蒸馏
6.轻量化模型

软寻址,硬寻址

从图9可以引出另外一种理解,也可以将Attention机制看作一种软寻址(Soft Addressing):Source可以看作存储器内存储的内容,元素由地址Key和值Value组成,当前有个Key=Query的查询,目的是取出存储器中对应的Value值,即Attention数值。通过Query和存储器内元素Key的地址进行相似性比较来寻址,之所以说是软寻址,指的不像一般寻址只从存储内容里面找出一条内容,而是可能从每个Key地址都会取出内容,取出内容的重要性根据Query和Key的相似性来决定,之后对Value进行加权求和,这样就可以取出最终的Value值,也即Attention值。所以不少研究人员将Attention机制看作软寻址的一种特例,这也是非常有道理的。

我们可以这样来看待Attention机制(参考图9):将Source中的构成元素想象成是由一系列的数据对构成,此时给定Target中的某个元素Query,通过计算Query和各个Key的相似性或者相关性,得到每个Key对应Value的权重系数,然后对Value进行加权求和,即得到了最终的Attention数值。所以本质上Attention机制是对Source中元素的Value值进行加权求和,而Query和Key用来计算对应Value的权重系数。即可以将其本质思想改写为如下公式:

Encoder: encoder由6个相同的层堆叠而成,每个层有两个子层。第一个子层是多头自我注意力机制(multi-head self-attention mechanism),第二层是简单的位置的全连接前馈网络(position-wise fully connected feed-forward network)。在两个子层中会使用一个残差连接,接着进行层标准化(layer normalization)。也就是说每一个子层的输出都是LayerNorm(x + sublayer(x))。网络输入是三个相同的向量q, k和v,是word embedding和position embedding相加得到的结果。为了方便进行残差连接,我们需要子层的输出和输入都是相同的维度。

重点:三个向量第一次初始都是相同的

Decoder: decoder也是由N(N=6)个完全相同的Layer组成,decoder中的Layer由encoder的Layer中插入一个Multi-Head Attention + Add&Norm组成。输出的embedding与输出的position embedding求和做为decoder的输入,经过一个Multi-HeadAttention + Add&Norm((MA-1)层,MA-1层的输出做为下一Multi-Head Attention + Add&Norm(MA-2)的query(Q)输入。MA-2层的输出输入到一个前馈层(FF),经过AN操作后,经过一个线性+softmax变换得到最后目标输出的概率。对于decoder中的第一个多头注意力子层,需要添加masking,确保预测位置i的时候仅仅依赖于位置小于i的输出。层与层之间使用的Position-wise feed forward network。

重点:解码阶段每一层的衔接关系
20200114 transformer 多层预测逻辑

key, query, value
对于encoder来说,其中key, query, value均来自前一层encoder的输出,即encoder的每个位置都可以注意到之前一层encoder的所有位置。
对于decoder来讲,有两个与encoder不同的地方:
一个是第一级的Masked Multi-head。key, query, value均来自前一层decoder的输出,但加入了Mask操作,即我们只能attend到前面已经翻译过的输出的词语,因为翻译过程我们当前还并不知道下一个输出词语,这是我们之后才会推测到的。
另一个是第二级的Multi-Head Attention不仅接受来自前一级decoder的输出,还要接收encoder的输出。第二级decoder也被称作encoder-decoder attention layer,即它的query来自于之前一级的decoder层的输出,但其key和value来自于encoder的输出,这使得decoder的每一个位置都可以attend到输入序列的每一个位置。
总结一下,k和v的来源总是相同的,q在encoder及第一级decoder中与k,v来源相同,在encoder-decoder attention layer中与k,v来源不同。
因此,Transformer会在三个不同的方面使用multi-head attention:

重点:对于NER 来说就不需要mask了,前后字符都是存在的,可以直接用

深度学习问题bug_第4张图片
深度学习问题bug_第5张图片
预测的最后一步 前面各种处理拼接起来形成[1,512] 最后乘以权重
[512 20] 得到 [1 20] 20个标签结果 如果是翻译的话 就是最大概率的20个字? 这里不对 有问题
深度学习问题bug_第6张图片
持久化模型中保存的一切参数都在这里面了 重点是 模型 和其里面包含的名称
深度学习问题bug_第7张图片
20200114 深度学习模型最后保存模型的参数包含了训练后的每个字符的
表征向量. 整个模型以字典嵌套的形式保存各种参数 以及对应的分组
深度学习问题bug_第8张图片
隐藏层的大小就是词的表征维度?

Understanding the difficulty of training deep feedforward neural network 中,fan_in指第i层神经元个数,fan_out指第i+1层神经元个数

简写:fn 函数
fc 全连接
act:激活

hook 就是逻辑顺序
forward 具体调用底层实现

深度学习问题bug_第9张图片
在某个维度上求最大

  1. 要考某个网络的详细信息 主要的入口在
    深度学习问题bug_第10张图片

可以在基础checkpoint 上面可以改成成任意的网络模型,少什么就加什么

什么是CUDA?
CUDA(Compute Unified Device Architecture),是显卡厂商NVIDIA推出的运算平台。 CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。

什么是CUDNN?
NVIDIA cuDNN是用于深度神经网络的GPU加速库。它强调性能、易用性和低内存开销。NVIDIA cuDNN可以集成到更高级别的机器学习框架中,如加州大学伯克利分校的流行caffe软件。简单的,插入式设计可以让开发人员专注于设计和实现神经网络模型,而不是调整性能,同时还可以在GPU上实现高性能现代并行计算。

上述计算过程描述了如何构建神经网络,通过神经网络完成预测值和损失函数的计算。接下来将介绍如何求解参数www和bbb的数值,这个过程也称为模型训练。模型训练的目标是让定义的损失函数尽可能的小,也就是说找到一个参数解www和bbb使得损失函数取得极小值。
模型训练

深度学习问题bug_第11张图片

上文提到,直接求解导数方程的方式在多数情况下较困难,本质原因是导数方程往往正向求解容易(已知X,求得Y),反向求解较难(已知Y,求得X)。这种特性的方程在很多加密算法中较为常见,与日常见到的锁头特性一样:已知“钥匙”,锁头判断是否正确容易;已知“锁头”,反推钥匙的形状比较难。

反向难道是求积分? 问题 不是求反向 就是求导数 主要是一步到位求导数为零很难求 那就按一定的方向分解成多步而非一步来走 每次走一个学习率个梯度单位?

这种情况特别类似于一位想从山峰走到坡谷的盲人,他看不见坡谷在哪(无法逆向求解出Loss导数为0时的参数值),但可以伸脚探索身边的坡度(当前点的导数值,也称为梯度)。那么,求解Loss函数最小值可以“从当前的参数取值,一步步的按照下坡的方向下降,直到走到最低点”实现。这种方法个人称它为“瞎子下坡法”。哦不,有个更正式的说法“梯度下降法”。

深度学习问题bug_第12张图片
权重计算 根据推导的公式计算得到
广播功能: 向量或者矩阵与一个数的运算 会把这个数广播到向量或矩阵
的所有元素

在这里插入图片描述

梯度是对所有的样本而言 求所有样本梯度的平均值
在这里插入图片描述
梯度更新

可以想象速度在导数变化的基础上的变化

新建一个array

a = np.array([1,2,3,4,5,6,7,8,9,10,11,12])
print(‘before shuffle’, a)
np.random.shuffle(a)
print(‘after shuffle’, a)
before shuffle [ 1 2 3 4 5 6 7 8 9 10 11 12]
after shuffle [ 7 2 11 3 8 6 12 1 4 5 10 9]

新建一个array

a = np.array([1,2,3,4,5,6,7,8,9,10,11,12])
a = a.reshape([6, 2])
print(‘before shuffle\n’, a)
np.random.shuffle(a)
print(‘after shuffle\n’, a)
before shuffle
[[ 1 2]
[ 3 4]
[ 5 6]
[ 7 8]
[ 9 10]
[11 12]]
after shuffle
[[ 1 2]
[ 3 4]
[ 5 6]
[ 9 10]
[11 12]
[ 7 8]]
观察运行结果可发现,数组的元素在第0维(第一层)被随机打乱,但第1维的顺序保持不变。例如数字2仍然紧挨在数字1的后面,数字8仍然紧挨在数字7的后面,而第二维的[3, 4]并不排在[1, 2]的后面。

评价函数(H(θ,X)H(\theta, X)H(θ,X) 和YYY相差)

预测值和真实值的差

模型假设,评价函数(损失/优化目标)和优化算法是构成一个模型的三个部分

反向传播:相当于把总误差分摊到各个参数上了
各个参数减去分担到的梯度,会使得总误差进一步的减少

优化器是对梯度更新这一步进行的策略优化不再是仅仅是单一的一步减法了??

训练的时候为什么要清除梯度? 啊 是的 每for 一次都是重新计算新的梯度
永远只保留一套梯度

with dygraph.guard() with fluid.dygraph.guard() 区别

深度学习问题bug_第13张图片
windows 下 只支持一个 一块gpu的解决方法

试试在命令行设置单卡看下
set CUDA_VISIBLE_DEVICES=0

如果是内存溢出问题
1.在edit configuration 里面 设置 cpu_num 从1 逐渐增加
2. batch size 逐渐增加
3.

深度学习问题bug_第14张图片
这里不能随便改 要用预训练本身的词汇表 这样词表尺寸
和原来保存的知识才有用

深度学习问题bug_第15张图片
数据并行 每一批数据和参数的关系
模型并行相当于流水线操作

基于DyGraph构建网络
编写一段用于DyGraph执行的Object-Oriented-Designed, PaddlePaddle模型代码主要由以下两部分组成: 请注意,如果您设计的这一层结构是包含参数的,则必须要使用继承自fluid.dygraph.Layer的Object-Oriented-Designed的类来描述该层的行为。

建立一个可以在DyGraph模式中执行的,Object-Oriented的网络,需要继承自fluid.dygraph.Layer,其中需要调用基类的__init__方法,并且实现带有参数name_scope(用来标识本层的名字)的__init__构造函数,在构造函数中,我们通常会执行一些例如参数初始化,子网络初始化的操作,执行这些操作时不依赖于输入的动态信息:

class MyLayer(fluid.dygraph.Layer):
def init(self, name_scope):
super(MyLayer, self).init(name_scope)
实现一个forward(self, *inputs)的执行函数,该函数将负责执行实际运行时网络的执行逻辑, 该函数将会在每一轮训练/预测中被调用,这里我们将执行一个简单的relu -> elementwise add -> reduce sum:

def forward(self, inputs):
    x = fluid.layers.relu(inputs)
    self._x_for_debug = x
    x = fluid.layers.elementwise_mul(x, x)
    x = fluid.layers.reduce_sum(x)
    return [x]

关于自动剪枝
每个 Variable 都有一个 stop_gradient 属性,可以用于细粒度地在反向梯度计算时排除部分子图,以提高效率。

如果OP只有一个输入需要梯度,那么该OP的输出也需要梯度。 相反,只有当OP的所有输入都不需要梯度时,该OP的输出也不需要梯度。 在所有的 Variable 都不需要梯度的子图中,反向计算就不会进行计算了。

在动态图模式下,除参数以外的所有 Variable 的 stop_gradient 属性默认值都为 True,而参数的 stop_gradient 属性默认值为 False。 该属性用于自动剪枝,避免不必要的反向运算。

你可能感兴趣的:(深度学习问题bug)