一些工作记录 3.22

一张图片经过 CLIP 的 encoder 后被编码为 \(226\text{(patch 数量)}*768{(嵌入维数)}\)

一张图片对应的 FMRI 信号(忽略空间坐标)为 \(20000\) 维的一个向量。

现在的目标是由 FMRI 信号预测图片的 CLIP 嵌入。

设训练集为 \(X \in \R^{N*20000},Y \in \R^{N*226*768}\)
测试集为 \(X_{te} \in \R^{M*20000},Y_{te} \in \R^{M*226*768}\)

几篇论文中的做法:

用岭回归的方法,
\(W_* = argmin_{W \in \R^{20000*226*768}} \frac{1}{n}\sum_{i=1}^{n} ||X_i \times W-Y_i||^2+\alpha ||W||^2\) (正则化线性回归)
预测 \(\hat{Y} = W_* \times X_{te}\)

可以发现 \(226*768\) 维中的每一维在式子中是独立的,也就是对每一维是可以单独算线性回归的。

对每一维,用交叉验证的方法确定超参数 \(\alpha \in \{10000, 20000, 40000\}\) 的最优值。

我的做法:

对每个 patch(一共 226 个),尝试用一个 MLP 去预测嵌入向量 \(\in \R^{768}\)

MLP 结构:

            self.model = nn.Sequential(nn.Linear(self.input_size, self.hidden_size[0]),)
            self.hidden_size.append(self.output_size)
            for i in range(len(self.hidden_size) - 1):
                self.model = nn.Sequential(self.model,
                                           nn.BatchNorm1d(self.hidden_size[i]),
                                           nn.Dropout(0.5),
                                           nn.ReLU(), 
                                           nn.Linear(self.hidden_size[i], self.hidden_size[i + 1]))

这里 hidden_size = [1024]

loss 就为 MSE loss

优化器为 SGD

正常来说 SGD 中的超参数 weight_decay 即对应岭回归中的 \(\alpha\)

但是有 \(weight\_decay * lr < 1\) 的限制,而且我发现当 \(weight\_decay\) 比较大时,train loss 并不能很好的下降下来。

最后设 \(weight\_decay=0.001\)

\(lr = 0.1\),余弦下降

最后训出来 226 个 MLP,在 \(X_{te}\) 上预测,并把嵌入向量还原成语义。

两个方法的 caption 对比:

测试集一共 982 张图片(选取前 50 张)

https://img2024.cnblogs.com/blog/1399352/202403/1399352-20240322230449625-1570572192.png

可以发现岭回归生成的 caption 还大致正确。

MLP 生成的 caption,很多时候不太通顺,语义也不太相关。

两个方法的 loss 对比:

虽然岭回归强于 MLP 很多,但是 MLP 预测的 MSE loss 要比岭回归小很多(这是在测试集上,所有样本的平均):

注:下面的 loss 指的就是 MSE loss,不加入正则项主要是两个方法不好比较,参数量不一样(一个矩阵,一个 MLP 两个线性层),正则化超参数也不一样(一个 \(\alpha\),一个 \(weight\_decay\),甚至差了几倍)

Ridge Regression loss :  0.32130912
MLP loss:  0.27595258116276117

对于具体的一张图:

平均如下:

Ridge Regression loss :  0.35694963792009293
MLP loss:  0.31689855714598125

下面是每个patch的 MSE loss,左边是Ridge Regression,右边是MLP

[[0.36590227 0.19434736]
 [0.42261639 0.37693829]
 [0.40978017 0.35917423]
 [0.41222015 0.34023356]
 [0.40507922 0.37267416]
 [0.38690725 0.36106848]
 [0.39881197 0.36717811]
 [0.39330783 0.34583928]
 [0.38123789 0.35820355]
 [0.43342009 0.34662655]
...

再看看这张图的每个 patch 的嵌入向量的余弦相似度的对比
平均:

Ridge Regression cos :  0.06605594178681794
MLP cos:  0.26598754285832804

每个patch:

[[ 1.29429340e-01  6.89241604e-01]
 [ 2.39103418e-02  2.41741772e-01]
 [ 1.39364870e-02  2.61922166e-01]
 [ 2.93417908e-02  3.55266584e-01]
 [-2.06943806e-02  1.62216246e-01]
 [ 8.66630599e-02  2.38289004e-01]
 [ 5.38801700e-02  1.92158980e-01]
 [ 5.03711142e-02  3.14879950e-01]
 [ 1.61768317e-01  2.76131801e-01]
 [-3.73815708e-02  3.10589251e-01]
 [ 6.45177215e-02  2.49447492e-01]
 [-8.86236597e-03  2.73631233e-01]
 [ 8.79604369e-02  2.13843478e-01]
 [ 6.48015216e-02  1.56775076e-01]
 [-1.96750835e-02  2.97419534e-01]
...

可以发现,不管 loss 还是 余弦相似度,不管是平均还是每个 patch, MLP 的预测效果都优于岭回归。

但是 MLP 就是还原出来的 caption 不行。

这是不是可能说明以 MSE 作为 loss 在 CLIP 嵌入空间不太好?

但是岭回归优化的式子本身又是 MSE 加上一个正则项,正则项本身是为了作为惩罚项防过拟合。

看起来正则项的作用不只防过拟合,不然 MLP 的方法拟合的已经比岭回归好了(效果应该比岭回归好才对)。

想知道下这个问题怎么继续分析和解决?

不然的话,即使加上空间信息(用 ViT)去拟合嵌入拟合得更好,还原出来的 caption 也不一定好。

联合多个特征作为输出层:

把顺序 10 个 特征联合作为输出层, 同时把 hidden_size 扩大了 16 倍到 8192*2

注:之所以选取这两个参数是因为一张 3090 只有 24 GB 显存。

训练出来 train_loss 和 test_loss 都会高一点,但是 caption 效果感觉上好一点:

见(取了测试集前100张)
https://img2024.cnblogs.com/blog/1399352/202403/1399352-20240323014850519-1381336459.png

效果好像比岭回归好一点,但是很多 caption 不通顺(待解决

posted @ 2024-03-22 23:26  Cold_Chair  阅读(41)  评论(0)    收藏  举报