PaddlePaddle不支持对向量进行2范数归一化
Created by: comeonfox
有些场景下需要对Layer的输出向量做2范数归一化,PaddlePaddle当前似乎不能直接支持此操作。
考虑间接的使用其他Layer来完成此操作:
squared_l2_norm = mixed_layer(inputs = dot_mul_operator(to_be_normed_vec, to_be_normed_vec))
# 开平方,square_root_power 是形如 [0.5] 的data_layer
l2_norm = power_layer(inputs = [square_root_power, squared_l2_norm])
# 求倒数,reciprocal_power是形如[-1.0]的data_layer
reciprocal_l2_norm = power_layer(inputs = [reciprocal_power, l2_norm])
# 给原始向量的每一位都乘以 1/2-norm
normalized_vec = scaling_layer(inputs = [reciprocal_l2_norm, to_be_normed_vec])
如上是我能想到的一种做2范数归一化的方法,但还存在3个问题:
- 当前PaddlePaddle的 dot_mul_operator 只做了向量的element-wise product,但没有做最后的加法;
- 当前power_layer 只支持cpu,在gpu上没有实现。
- 上边的方法需要两次通过data_layer传入power_layer所需的指数,并且在计算power(0.5)之前需要给被开方的向量添加一个很小的偏移量防止出现负数,这是一个比较容易被忽略的地方。
PaddlePaddle是否可以直接支持2范数归一化,或者提供完整的 dot_product 操作来间接支持?或者是否有其它的方法可以实现2范数归一化?