- Jun 2024
-
-
关于隐藏层输出的梯度∂J/∂h∈Rh由下式给
这里的 \(\partial o / \partial h\) 的结果是符合矩阵求导的,得到的也是 \(W^{(2)\prime}\)
为什么是 \({\mathbf{W}^{(2)}}^\top \frac{\partial J}{\partial \mathbf{o}}\) 而不是 \(\frac{\partial J}{\partial \mathbf{o}}{\mathbf{W}^{(2)}}^\top\) 这个主要是因为前面也提到,prod运算符是指执行必要的操作,也就是说会自动根据需要进行换位和交换输入位置等,然后再进行相乘。然而这里的 \(\frac{\partial J}{\partial \mathbf{o}}\) 是h维向量,\(W^{(1)}\) 是 h❌d 维,所以(转置后)必须写到前面
-
链式法则得出
下面这个求导法则在数学上是有点问题的
$$ W^{(2)}h = \begin{pmatrix} w^{(2)\prime}{1}\ w^{(2)\prime}{2} \ \vdots& \ w^{(2)\prime}{q} \ \end{pmatrix} \begin{pmatrix}h{1} \ h_{2} \\vdots\ h_{h}\end{pmatrix} = \begin{pmatrix} w^{(2)\prime}{1} h\ w^{(2)\prime}{2} h\ \vdots& \ w^{(2)\prime}_{q} h\ \end{pmatrix} $$
- \(w^{(2)}_{1}\) 为 \(W^{(2)}\) 每个输出单元对应的仿射变换的权重 h维 列向量,上面转置以适应矩阵乘法 \(o=W^{(2)}h\)
\(\frac{\partial (W^{(2)}h)}{\partial W^{(2)}}\) 这种矩阵求导不存在的,实际上是做什么呢?其每个分量对每个分量求导,即 \(\frac{\partial (w^{(2)\prime}{1}h)}{\partial w^{(2)}{1}}=h\) ,其他分量也得到 \(h\) 。
为了 \(W^{(2)}\) 能够与这个结果直接进行加减运算、更新梯度, 求导的结果可记为(注意这种求导依然是不存在的)
$$ \frac{\partial (W^{(2)}h)}{\partial W^{(2)}} = \begin{pmatrix}h^T \ h^T \ \vdots \ h^T\end{pmatrix} $$
W2-=eta * G
,其中eta为学习率,G为 \(h^{T}\) ,这样写没问题,因为有广播原则!
-
-
-
l = loss(net(X), y) + lambd * l2_penalty(w)
- loss 的每个分量都增加了一个
lambd*l2_penalty
- 总Loss增加了
batch_size*lambd*l2_penalty
↔ \(\lambda/2 \lVert\mathbf{w}\rVert^2\)
最有意思的是,这也是 pytroch torch.optim.SGD() 里面设置的 weight_decay 的运行方式,即weight_decay 作用于每个维度的参数,最终加和反映到该批次总的目标函数上
自定义实现,这里确实得运用广播机制,每个分量都得加 penalty,而不是
python l = loss(net(X), y) (l.sum()+lambd * l2_penalty(w)).backward()
d2l.sgd() 在反向传播的时候都是除以 bacth_size,所以这里要加,就是每个分量都要加
所以李沐的手动实现代码和简洁实现代码中的 lambd 的效果完全等价,训练的可视化图形的差异是别的原因
- loss 的每个分量都增加了一个
-
trainer = torch.optim.SGD([ {"params":net[0].weight,'weight_decay': wd}, {"params":net[0].bias}], lr=lr)
无权重衰减的写法,查看 https://zh.d2l.ai/chapter_linear-networks/linear-regression-concise.html
python trainer = torch.optim.SGD(net.parameters(), lr=0.03)
-
net, loss = lambda X: d2l.linreg(X, w, b), d2l.squared_loss
这个 lambda 函数非常有意思,返回的是两个函数 ❌
等价为
python net = lambda X: d2l.linreg(X, w, b) loss = d2l.squared_loss
-
load_array
```python
Defined in file: ./chapter_linear-networks/linear-regression-concise.md
def load_array(data_arrays, batch_size, is_train=True): """Construct a PyTorch data iterator.""" dataset = data.TensorDataset(*data_arrays) return data.DataLoader(dataset, batch_size, shuffle=is_train) ```
-
synthetic_data
```python
Defined in file: ./chapter_linear-networks/linear-regression-scratch.md
def synthetic_data(w, b, num_examples): """Generate y = Xw + b + noise.""" X = d2l.normal(0, 1, (num_examples, len(w))) y = d2l.matmul(X, w) + b y += d2l.normal(0, 0.01, y.shape) return X, d2l.reshape(y, (-1, 1)) ``` d2l.reshape 就是调用 reshape(tensor, [shape]) 就地修改
python reshape = lambda x, *args, **kwargs: x.reshape(*args, **kwargs)
-
给定k个变量,阶数为d的项的个数为 (k−1+dk−1),即Ck−1+dk−1=(k−1+d)!(d)!(k−1)!。
这个的数学计算没搞懂
-
-
-
torch.rand
Returns a tensor filled with random numbers from a uniform distribution on the interval :math:
[0, 1)
-
num_epochs, lr, batch_size = 10, 0.5, 256 loss = nn.CrossEntropyLoss(reduction='none') train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size) trainer = torch.optim.SGD(net.parameters(), lr=lr) d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)
这些代码和简洁实现的代码一样,所以
class Ne(nm.Module) 和 nn.Sequentia() 返回的东西是一样的
-
mask * X
元素乘积
-
-
-
return (H@W2 + b2)
net 给的是 \(o_k\), 交叉熵损失由 nn.CrossEntropyLoss(reduction='None') 来解决
-
X@W1
在PyTorch中,
torch.mm(A, B)
和A @ B
都是用来进行矩阵乘法的。torch.mm(A, B)
是一个函数,它接受两个2D张量(即矩阵)作为输入,并返回它们的矩阵乘积。这个操作遵循矩阵乘法的规则,即A
的列数必须等于B
的行数。A @ B
是一个运算符,它也是用来进行矩阵乘法的。它的行为与torch.mm(A, B)
基本相同,但是它还支持高维张量的乘法。对于高维张量,它会对最后两个维度进行矩阵乘法,其他维度必须匹配或者为1。例如:
```python import torch
A = torch.tensor([[1, 2], [3, 4]]) B = torch.tensor([[5, 6], [7, 8]])
C = A @ B print(C) # 输出:tensor([[19, 22], [43, 50]]) ```
在这个例子中,
A @ B
和torch.mm(A, B)
的结果是相同的。但是如果A
和B
是高维张量,那么A @ B
可以进行高维矩阵乘法,而torch.mm(A, B)
则会报错。
-
-
-
我们试图只用来自大学生的人脸数据来训练一个人脸识别系统, 然后想要用它来监测疗养院中的老人。
训练的抽样数据彼此间有相关性,但是训练数据和测试数据间相关性很弱,违反 iid
-
不是让模型记住 ID 和 outcome 之间的关系,而是具备预测能力
-
-
-
net.apply(init_weights);
类似 Dataframe.apply 函数
-
nn.init.normal_
nn.init.normal_(m.weight, std=0.01)
是 PyTorch 中的一个函数,用于将权重初始化为正态分布。这个函数会就地(in-place)改变m.weight
的值。在这个函数中,
m.weight
是一个nn.Linear
层的权重张量,std=0.01
是正态分布的标准差。函数将m.weight
中的每个元素初始化为一个随机数,这个随机数来自均值为0、标准差为0.01的正态分布。这种初始化方法常用于神经网络的权重初始化,因为它可以在训练开始时打破权重的对称性,有助于避免模型陷入不良的局部最优解。
-
nn.Flatten()
⇔ X = X.reshape((-1, num_inputs))
-
-
-
assert train_loss < 0.5, train_loss assert train_acc <= 1 and train_acc > 0.7, train_acc assert test_acc <= 1 and test_acc > 0.7, test_acc
这段代码是在进行一些断言检查,以确保训练和测试的结果满足一些预期的条件。
python assert train_loss < 0.5, train_loss
这行代码是检查训练损失(train_loss
)是否小于0.5。如果train_loss
大于或等于0.5,那么断言就会失败,程序会抛出一个AssertionError
异常,并打印出train_loss
的值。python assert train_acc <= 1 and train_acc > 0.7, train_acc
这行代码是检查训练准确率(train_acc
)是否在0.7到1之间。如果train_acc
小于0.7或大于1,那么断言就会失败,程序会抛出一个AssertionError
异常,并打印出train_acc
的值。python assert test_acc <= 1 and test_acc > 0.7, test_acc
这行代码是检查测试准确率(test_acc
)是否在0.7到1之间。如果test_acc
小于0.7或大于1,那么断言就会失败,程序会抛出一个AssertionError
异常,并打印出test_acc
的值。这些断言检查通常用于确保程序的运行结果满足预期。如果某个断言检查失败,那么说明可能存在一些问题,例如模型可能没有正确地训练,或者数据可能存在一些问题。
-
class Animator
这段代码定义了一个名为
Animator
的类,该类用于在动画中绘制数据。下面是对这个类的主要方法和属性的解释:-
__init__
:这是类的构造函数,用于初始化对象。它接受多个参数,包括标签、坐标轴限制、坐标轴比例、线型、子图数量、图形大小等。这些参数用于配置图形的各种属性。 -
add
:这个方法用于向图表中添加数据点。它接受两个参数x
和y
,分别表示数据点的x坐标和y坐标。如果x
或y
不是列表,那么它会被转换为列表。然后,这些数据点被添加到self.X
和self.Y
中,这两个属性分别存储所有数据点的x坐标和y坐标。最后,这个方法会清除当前的图形,然后根据新的数据点重新绘制图形。 -
self.fig
和self.axes
:这两个属性分别表示图形和子图的对象。self.fig
是一个Figure
对象,表示整个图形。self.axes
是一个Axes
对象的列表,表示图形中的子图。 -
self.config_axes
:这是一个函数,用于配置子图的各种属性,如标签、坐标轴限制、坐标轴比例等。 -
self.X
和self.Y
:这两个属性分别存储所有数据点的x坐标和y坐标。 -
self.fmts
:这个属性存储了线型的列表,用于在绘制数据点时指定线型。
这个类的主要作用是提供一个方便的接口,用于在动画中绘制数据点。你可以创建一个
Animator
对象,然后通过调用add
方法向图表中添加数据点。每次调用add
方法时,图表都会被清除并重新绘制,因此你可以看到数据点的动态变化。 -
-
X.shape[0]
batch_size
-
l.mean().backward()
l.mean().backward():当使用PyTorch内置的优化器和损失函数时,损失l是一个批次的平均损失,因此我们需要对平均损失进行反向传播。这样做的好处是,平均损失对批次大小不敏感,无论批次大小如何,梯度的规模都保持不变。
-
zip(self.data, args)
``` list(zip([0,0], [1,2]))
[(0, 1), (0, 2)] ``` [0+1,0+2] 更新
-
-
zh.d2l.ai zh.d2l.ai
-
retain_graph=True
sigmoid函数的导数为下面的公式:
$$\frac{d}{dx} \operatorname{sigmoid}(x) = \frac{\exp(-x)}{(1 + \exp(-x))^2} = \operatorname{sigmoid}(x)\left(1-\operatorname{sigmoid}(x)\right).$$
sigmoid函数的导数图像如下所示。 注意,当输入为0时,sigmoid函数的导数达到最大值0.25; 而输入在任一方向上越远离0点时,导数越接近0。
一个常见的需要保留计算图的例子是计算二阶导数(或者叫做Hessian向量积)。在某些优化算法,如牛顿法和共轭梯度法中,需要用到二阶导数。下面是一个简单的例子:
```python import torch
创建一个张量,并设置requires_grad=True使其可以计算梯度
x = torch.tensor([1.0], requires_grad=True)
定义一个函数
y = x ** 3
第一次反向传播,计算一阶导数
y.backward(retain_graph=True)
打印一阶导数
print(x.grad) # 输出:tensor([3.])
因为我们要进行第二次反向传播,所以需要先清零梯度
x.grad.zero_()
第二次反向传播,计算二阶导数
y.backward(retain_graph=True)
打印二阶导数
print(x.grad) # 输出:tensor([6.]) ```
在这个例子中,我们首先定义了一个函数
y = x ** 3
,然后我们两次调用.backward()
方法,第一次计算一阶导数,第二次计算二阶导数。在两次反向传播之间,我们需要调用x.grad.zero_()
来清零梯度,因为PyTorch默认会累积梯度,而不是替换梯度。同时,我们需要在调用.backward()
方法时设置retain_graph=True
,以保留计算图,否则在第二次反向传播时会报错,因为计算图已经被清空。 -
输入层不涉及任何计算,因此使用此网络产生输出只需要实现隐藏层和输出层的计算。 因此,这个多层感知机中的层数为2。
李沐 按照计算层的数量定义层数
-
-
-
reduction='none'
nn.CrossEntropyLoss
是PyTorch中的一个类,它实现了交叉熵损失函数。交叉熵损失函数常用于多分类问题,它可以度量模型的预测概率分布与真实概率分布之间的差异。reduction='none'
是一个参数,它指定了如何对每个样本的损失进行聚合。'none'
表示不进行聚合,即返回一个损失值的向量,向量的每个元素对应一个样本的损失。其他可能的值包括'mean'
(返回所有样本损失的平均值)和'sum'
(返回所有样本损失的总和)。在 train_ch3 → train_epoch_ch3 中内置优化器是 l.mean().backwar()
在这个例子中,我们选择
'none'
是因为我们想要在后续的计算中手动处理每个样本的损失,例如,我们可能想要计算每个样本损失的平均值,或者只关注损失最大的几个样本。
-
-
github.com github.com
-
tutorial
文章 《Uncovering ecological state dynamics with hidden Markov models》 的Appendix pd,已存档Zotero
-
- Mar 2024
-
zhuanlan.zhihu.com zhuanlan.zhihu.com
-
分析:由BLR一阶差分自相关图和偏自相关图,自相关图的短期(阶数为5期),自相关系数衰减快,具有短期自相关性,表现为拖尾。除了延迟4期和14期跳出阴影图,其余均落在2倍标准误范围内,绕零值做上下不超过0.2的波动。偏自相关图的短期(阶数为5期),自相关系数衰减快,具有短期自相关性,表现为拖尾。除了延迟4期、14期和18期跳出阴影图,其余均落在2倍标准误范围内,绕零值做上下不超过0.1的波动
什么样的模型要验证直到20阶以后的(偏)自相关系数呀都不用看。 所以这两个图都是拖尾
-
-
-
Fleurs
在此数据集上,Spanish错误率最低为2.8%,English的错误率为4.1%,中文Mandarin的错误率为7.7%。
-
- Jan 2024
-
-
You're getting an error when delta=c(0,1) because parameters cannot be set on a boundary
不能设置为1或0这两个边界值,只能设置成非常接近边界值的值,例如1.e-100
-
So the first state seems not to honor the given initial distribution, because the first sequence starts from state 2 instead of state 1.
ID step angle x y states 1 1 833.60385 NA 0.0000 0.0000 2
-
- Sep 2023
-
wrds-www.wharton.upenn.edu wrds-www.wharton.upenn.edu
-
served as director during the indicated fiscal year
只是董事会成员,并不一定是董事长
-
-
isso.utdallas.edu isso.utdallas.edu
-
Only salary statements from a sponsor will be accepted.
赞助人的薪资声明,那就是要顾老师的薪资证明,是不可以的
-
Incoming J-1 Exchange Students
点击这个查看学费估算
-
bank statements
银行资产证明
-
Tuition Insurance
但是这个tuition insurance 需不需要买呢?
-
Once you enroll in classes
我们不注册课程
-
-
github.com github.com
-
just the means that are shown when you print the model
指的是 plot.momentHMM ↔ plot(momentHMM)
-
- Aug 2023
-
stats.oarc.ucla.edu stats.oarc.ucla.edu
-
Note that if we added a random slope, the number of rows in Z would remain the same, but the number of columns would double.
这里只考虑了随机截距,没有随机斜率。但是可以有些变量也有随机效应的 \(z\)的列双倍,那意味着\(u\)的行也要双倍
-
.878
\(\exp(-0.13)=0.878\)
-
the 20th, 40th, 60th, and 80th percentiles
下面的 u = -.158,-0.47,0.54,1.82 分别对应随机效应u的这四个分位数
-
remission
病情缓解
-
GLMM
genelarized linear mixed model 多了个mixed
-
Note that we call this a probability mass function rather than probability density function because the support is discrete (i.e., for positive integers).
第一次明白 probability mass function 和 probability density function的区别
-
We could also frame our model in a two level-style equation
不再使用开头的矩阵表达,转为 two level-style equation
注意:依然只有随机斜率,没有随即截距
-
The final element in our model is the variance-covariance matrix of the residuals
开始讨论模型的最后一个元素,the variance-covariance matrix of the residuals
-
Because we directly estimated the fixed effects, including the fixed effect intercept, random effect complements are modeled as deviations from the fixed effect, so they have mean zero
为什么假设随机效应服从的正态分布均值为0的理由
-
-
-
To my knowledge there is no way to "fit the HMM in parallel".
没有拟合单个HMM并行加速的方法
-
- Jul 2023
-
statisticsglobe.com statisticsglobe.com
-
size (i.e. number of trials)
与momentuHMM包的 dnbinom_rcpp 函数不同,这里的size 指的是总的 trials
-
- Jun 2023
-
zhuanlan.zhihu.com zhuanlan.zhihu.com
-
389.25
这个均值算错了,应该是 388.5
-
-
grf-labs.github.io grf-labs.github.io
-
这个图有三种颜色的原因是:红色和绿色重合了,变成了另外一种颜色
-
- May 2023
-
grf-labs.github.io grf-labs.github.io
-
The superscript (-1)
这里写错了,应该是上标 $$(-i)$$
-
We say the first subset participated in a trail, and that Si=1Si=1S_i = 1, and the second did not: Si=0Si=0S_i = 0.
trail population $$S_i=1$$ covariates + binary treatment + response
target population $$S_i=0$$ 只有covariates
-
RCT
In the context of the article you mentioned, RCT stands for Randomized Controlled Trial. It refers to a subset of a population for which we have access to results from a randomized/observational trial/study 在你提到的文章中,RCT代表随机对照试验。它指的是我们可以从随机/观察性试验/研究中获得结果的人群的一个子集
-
- Apr 2023
-
zhuanlan.zhihu.com zhuanlan.zhihu.com
-
一旦获得了 _weight 变量,就相当于对样本的匹配情况进行了标记,我们可以直接在 regress 命令后附加加 fweight = _weight 进行样本匹配后的回归。其中,fweight 为「frequency weights」的简写,是指观测值重复次数的权重。若是 1:2 重复匹配,成功匹配的处理组 _weight = 2 / 2,成功匹配的控制组 _weight = 参与匹配次数 / 2,即都要除以 2 进行标准化。因此,若想继续使用 fweight 选项,需要 _weight * 2 转化为频数。
忽略了处理组个体的 _weight 需要为1
Tags
Annotators
URL
-
-
pandas.pydata.org pandas.pydata.org
-
Replace all NaN elements in column ‘A’, ‘B’, ‘C’, and ‘D’, with 0, 1, 2, and 3 respectively.
可以对部分列进行操作,不需要对所有列都进行操作(填补缺失值)
-
-
www.statalist.org www.statalist.org
-
Correction:
这个 $(1+x_i)'$ 有点问题,应该是 $(1 x_i)'$ 这样的转置后的一个行向量
-
-
bbs.pinggu.org bbs.pinggu.org
-
通常在使用xtreg, fe命令时(即控制了企业层面的个体固定效应),如果再控制行业或者区域就会出现多重共线性的问题,会被stata自动drop掉,因为企业层面的个体固定效应已经包含了行业或者区域固定效应。
肯定的呀,你自己都知道因为多重共线性被 omitted 了
典型的 nested 固定效应
-
那为什么reghdfe可以同时控制这三者(即企业、地区、行业)并且不提示共线性的问题?(虽然结果是与xtreg, fe命令一致的)。
因为 -reghdfe- 根本不会汇报固定效应,而是直接在redundant 栏汇报
-xtreg, fe- 除了个体固定效应外,其他的都会汇报
-
- Mar 2023
-
zhuanlan.zhihu.com zhuanlan.zhihu.com
-
4、Wallhaven
这个挺好用的
-