Ответ 1
Хотя история использования привязанных весов в автокодировках, теперь дни редко используются (насколько мне известно), и я считаю, что этот пример Caffe не использует привязанные веса.
Тем не менее, Caffe поддерживает автокодеры с привязанными весами, и возможно использовать две функции: разделение параметров между слоями и флаг транспонирования полностью подключенного уровня (InnerProduct в Caffe). Более конкретно, два параметра разделяются в Caffe, если их имя одинаковое, которое может быть указано в поле param так:
layer {
name: "encode1"
type: "InnerProduct"
bottom: "data"
top: "encode1"
param {
name: "encode1_matrix"
lr_mult: 1
decay_mult: 1
}
param {
name: "encode1_bias"
lr_mult: 1
decay_mult: 0
}
inner_product_param {
num_output: 128
weight_filler {
type: "gaussian"
std: 1
sparse: 15
}
bias_filler {
type: "constant"
value: 0
}
}
}
Если на другом полностью подключенном слое (с соответствующими размерами) используются имена "encode1_matrix" и "encode1_bias", то эти параметры всегда будут одинаковыми, и Caffe позаботится об агрегировании градиентов и правильном обновлении параметров. Вторая часть использует флаг транспонирования полностью подключенного уровня, так что общая матрица транспонируется перед умножением ее ввода. Итак, расширив приведенный выше пример, если бы мы хотели иметь полностью подключенный слой с той же весовой матрицей, что и "encode1_matrix" как часть процесса декодирования, тогда мы определим его так:
layer {
name: "decode1"
type: "InnerProduct"
bottom: "encode1"
top: "decode1"
param {
name: "encode1_matrix"
lr_mult: 1
decay_mult: 1
}
param {
name: "decode1_bias"
lr_mult: 1
decay_mult: 0
}
inner_product_param {
num_output: 784
transpose: true
weight_filler {
type: "gaussian"
std: 1
sparse: 15
}
bias_filler {
type: "constant"
value: 0
}
}
}
Обратите внимание, что параметры смещения не разделяются (не могут быть из-за разных размеров вывода), тогда как матрицы разделяются, а на уровне декодера используется флаг транспонирования, который завершает привязанную архитектуру автоматического кодирования.
См. здесь полный рабочий пример связанного автокодера с использованием Caffe: https://gist.github.com/orsharir/beb479d9ad5d8e389800c47c9ec42840