UDA & MixMatch

UDA

使用无监督方法,基本架构类似SimCLR等对比学习模型。

图中M为自定义的模型。

模型损失,UDA部分:

加上监督学习部分:

数据增广

图片数据:AutoAugment (RandAugment)、Cutout

文本数据:BackTranslation;基于TF-IDF的词替换,保留重要关键词,替换不重要词

训练方法

Training Signal Annealing (TSA),在训练时逐步释放训练信号:

模型在有标注数据上,先拟合预测概率小于 \(\eta_t\) 的数据,逐渐调整 \(\eta_t\),训练先难后易。

三种策略设置三种 \(\alpha_t\)

  • log:
  • linear:
  • exp:

当模型容易过度拟合时,例如,当问题相对容易或标记数据非常有限时,exp-schedule是最合适的。相反,当模型不太可能过度拟合时(例如,当有丰富的标记数据或当模型使用有效的正则化时),log-schedule更合适。

其他处理

  1. 在使用模型M预测 无标注数据时,使用Confidence-based masking,将概率小于 \(\beta\) 的过滤掉。
  2. 使用sharpening prediction,大的更大,小的更小。

  1. 可以使用entropy minimization:

​ 上式中还可以使用MixMatch sharpenig:

  1. Domain-relevance Data Filtering:对于外部搜集的数据,对于每个类别,都基于对所有示例进行排序属于该类别的概率,并选择概率最高的示例,构成外部数据。

官方实现

MixMatch

papertf2.0

方法

另一种混合有标签和无标签数据的方法。整体方法如下:

  1. 对于有标签数据,增广batch个,联合其标签 \(p_b\) 构成 \(\hat{X}\)
  2. 对无标签数据,每个样本增广K个,通过Label Guessing,取模型对K个样本预测的均值,作为这K个样本的伪标签。构成样本集 \(\hat{U}\).
  3. Shuffle样本集,将其进行MixUp,得到MixMatch样本集合

然后通过下式计算模型损失,模型为自定义模型:

H就表示普通交叉熵损失,若是分类问题时。p、q就是MixMatch中得到的标签。q来自Label Guessing。

细节

使用的方法:

  1. 数据增广:crop, flip等常见方法
  2. Label Guessing:
  3. sharpening:
  4. MixUp:

  1. 模型训练时可采用滑动平均、weight decay等方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@tf.function
def sharpen(p, T):
return tf.pow(p, 1/T) / tf.reduce_sum(tf.pow(p, 1/T), axis=1, keepdims=True)


@tf.function
def mixup(x1, x2, y1, y2, beta):
beta = tf.maximum(beta, 1-beta)
x = beta * x1 + (1 - beta) * x2
y = beta * y1 + (1 - beta) * y2
return x, y

...
def ema(model, ema_model, ema_decay):
for var, ema_var in zip(model.variables, ema_model.variables):
if var.trainable:
ema_var.assign((1 - ema_decay) * var + ema_decay * ema_var)
else:
ema_var.assign(tf.identity(var))

消融实验结果:

使用论文中提到的所有方法,才能取得最好的结果。其中MixUp操作的影响最大。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!