Я пытаюсь внедрить adadelta в мою простую прямую нервную сеть , но я думаю, что у меня проблемы с пониманием статьи. http://arxiv.org/pdf/1212.5701v1.pdf
Это небольшая статья, объясняющая/вводя алгоритм adadelta. Только 1 с половиной страниц сосредоточены на формулах.Попытка понять алгоритм adadelta
Начиная от части:
обновлениеАлгоритм 1 вычисления ADADELTA в момент времени т
Вопрос 1 часть: '3: Вычислить градиент: GT'
Как я могу рассчитать градиент здесь? ли мой путь правильный:
/* calculating gradient value for neuron what is inside the hidden layer
gradient = sum of (outcoming connection target's gradient * outcoming connection's weight) * derivative function */
double CalculatHiddenGradient() {
double sum = 0.0;
for (int i = 0; i < OutcomingConnections.size(); i++) {
sum += OutcomingConnections[i]->weight * OutcomingConnections[i]->target->gradient;
}
return (1.0 - output * output) * sum; // tanh's derivative function
}
// calculating gradient value for output neurons where we know the desired output value
double CalculatGradient(double TargetOutput) {
return (TargetOutput - output) * (1.0 - output * output);
}
Вопрос 2 часть: '5: Compute Обновление: Δxt'
формула (14) говорит следующее:
Δxt = - (RMS [Δx] t-1)/RMS [г] t) *.
является RMS [? X] T-1 вычисления, как следующие:
RMS [? X] трет-1 = SQRT (Е [Δx²] трет-1 + е)
принимая тело из формулы (9)?
Основываясь на том, что я corrently понимаю, я был в состоянии написать этот кусок кода:
class AdaDelta {
private:
vector<double> Eg; // E[g²]
vector<double> Ex; // E[∆x²]
vector<double> g; // gradient
int windowsize;
double p; // Decay rate ρ
double e; // Constant e, epsilon?
public:
AdaDelta(int WindowSize = 32, double DecayRate = 0.95, double ConstantE = 0.001) { // initalizing variables
Eg.reserve(WindowSize + 1);
Ex.reserve(WindowSize + 1);
Eg.push_back(0.0); // E[g²]t
Ex.push_back(0.0); // E[∆x²]t
g.push_back(0.0); // (gradient)t
windowsize = WindowSize; // common value:?
p = DecayRate; // common value:0.95
e = ConstantE; // common value:0.001
}
// Does it return weight update value?
double CalculateUpdated(double gradient) {
double dx; // ∆xt
int t;
// for t = 1 : T do %% Loop over # of updates
for (t = 1; t < Eg.size(); t++) {
// Accumulate Gradient
Eg[t] = (p * Eg[t - 1] + (1.0 - p) * (g[t] * g[t]));
// Compute Update
dx = -(sqrt(Ex[t - 1] + e)/sqrt(Eg[t] + e)) * g[t];
// Accumulate Updates
Ex[t] = Ex[t - 1] + (1.0 - p) * (dx * dx);
}
/* calculate new update
=================================== */
t = g.size();
g.push_back(gradient);
// Accumulate Gradient
Eg.push_back((p * Eg[t - 1] + (1.0 - p) * (g[t] * g[t])));
// Compute Update
dx = -(sqrt(Ex[t - 1] + e)/sqrt(Eg[t] + e)) * g[t];
// Accumulate Updates
Ex.push_back(Ex[t - 1] + (1.0 - p) * (dx * dx));
// Deleting adadelta update when window has grown bigger than we allow
if (g.size() >= windowsize) {
Eg[1] = 0.0;
Ex[1] = 0.0;
Eg.erase(Eg.begin());
Ex.erase(Ex.begin());
g.erase(g.begin());
}
return dx;
}
};
Вопрос 3
В обратном распространении, обновления веса идет как этот
целевой градиент * выход источника * lear ning rate
но в алгоритме adadelta я не вижу этого действия. Должен ли я смешивать выходной сигнал источника с градиентом цели перед вызовом функции CalculateUpdated() или мне нужно смешать вывод с возвращаемым значением, чтобы получить новое значение веса?
Вопрос 4
Часть того, что заставило меня путать весь путь
3,2. Идея 2: Правильные единицы с приближением Гессиана
Я не совсем понимаю, какую формулу мы обновляем здесь или какие изменения. Где мы применяем приведенную ниже формулу?
формула (13) Δx = (Δx/∂f)/∂x;
Вопрос 5
что делает? X, ∂f, ∂x стоять в формуле (13)?
Спасибо!
Будет также полезно указать топологию вашей сети. Сколько слоев и сколько нейронов на каждом слое? –
Я пойду с простой сетью, предназначенной для решения проблемы xor, поэтому позже один я мог бы понять, как создавать более сложные сети. Один скрытый слой, два входа, два скрытых нейрона и один выход. Входной и скрытый слой с одним нейронным смещением. –
Дэвид Миллер сделал то же самое, поэтому, возможно, вам стоит взглянуть на его [** Учебник **] (https://vimeo.com/19569529) –