当数据 X 源域与目标域的数据分布不一致时,会导致对于任意
(1)上层参数需要不断适应新的输入数据分布,降低学习速度; (2)下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止; (3)每层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎。
为此提出了各种 Normalization 方案:
当数据 X 源域与目标域的数据分布不一致时,会导致对于任意
(1)上层参数需要不断适应新的输入数据分布,降低学习速度; (2)下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止; (3)每层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎。
为此提出了各种 Normalization 方案:
假设 x=np.arange(2,2,3).reshape(2,2,3)
1 | array([[[ 0, 1, 2], |
此时的数组的形状 (2,2,3) 定义为:
索引: 0 1 2
形状: 2 2 3
x = np.transpose(x, axes=(1,0,2))
执行之后的数组如下
1 | array([[[ 0, 1, 2], |
其实就是把元素的索引交换了,比如元素 6
,它之前的索引为 (1, 0, 0),根据 transpose 的要求,把第 0 个索引与第 1 个索引交换,因此变化后的的索引为 (0, 1, 0).
y = x.reshape([batchsize, -1, sentsize, wordsize])
意思是把 x 的形状改为 (batch, -1, sentsize, wordsize),其中 -1 这个维度的大小根据其他维计算的,也就是 total_size/batch/sentsize/wordsize
指导: 如果需要原张量的拷贝(copy),就使用.clone()方法; 而如果需要原张量的视图(view),就使用.view()方法; 如果想要原张量的视图(view),但是原张量不连续(contiguous),不过原张量拥有兼容的步长(strides),此时可以考虑使用.reshape()函数。
1 | a = torch.randint(0, 10, (3, 4)) |
1 | a = torch.arange(24).view(4, 6) |
torch.nn.Conv2d(1, 10, kernel_size=3,stride=2,bias=False)
输入 - input (seq_len, batch, input_size) - h_0 (num_layers * num_directions, batch, hidden_size) - c_0 (num_layers * num_directions, batch, hidden_size)
输出 - output (seq_len, batch, num_directions * hidden_size) - h_n (num_layers * num_directions, batch, hidden_size) - c_n (num_layers * num_directions, batch, hidden_size)
举例子:假设词向量维度为 100,句子包含 24 个词,一次训练 10 个句子。那么 batch_size=10, seq_len=24, input_size=100。隐藏层的输出的维度为 hidden_size,它主要用于设置隐藏层向量表示和参数 W,b 的维度。
如果 hidden_size=16,则
输入门:
遗忘门:
输出门:
两种记忆:
长期记忆:
短期记忆:
这两个方法都会分离模型中的某些参数(通过 self.grad_fn=None
)。detach_() 除了冻结节点,还会更改变量的依赖关系有向无环图。这种机制可以实现模型的微调,比如一些语言模型在某个具体分类问题上的微调,其实只需要重新训练分类器就好了,不需要再去学习向量表达 参考。
detach() 从当前图分离的新变量,该变量永远不会用梯度。返回了一个复制了的变量与原变量指向同一个 tensor.
1 | def detach(self): |
detach_() 直接将变量从创建它的图中分离出来,把它作为叶子节点
1 | def detach_(self): |
比如存在这样一个变量依赖链 y._detach()
,此时整个变量的依赖关系也变化了 y.detach()
可以达到相同效果,但是保留了原有的图结构。
假设有两个 layer:
1 | # 第一种方法 x -> y -> z |
y.backward()
,但是第二种方法不能 y.backward()
,因为 x 与 y 已经在原图中断开了。
DNN used in many areas nowadays, and Pytorch would be a very friendly tool for beginers for its clear programming logic and high level wrappers.
Version Information: