Я понял, что мне нужно изменить свое базовое состояние, чтобы оно было более общим.В то время как первое условие остановило функцию, когда была найдена активация, умноженная на дифференцируемый вес, функция продолжала пытаться дифференцировать остальную часть активаций, после которой вес оказывал влияние на функцию.По сути, я оказался на ∂/∂w(aw + a2w2 + ...)
, и pd
вернул бы активацию, умноженную на w
, когда этот термин был дифференцирован, но продолжил с рекурсией для других терминов, на которые больше не влияло w
и, следовательно,никогда не достигнет базового состояния.Таким образом, решение состояло в том, чтобы возвращать значение a
всякий раз, когда функция достигла слоя веса, поскольку вышеупомянутая производная оценивается как (a + 0 + ...)
.
private pd(a : Activation, w : Weight, t : number) : number { //Takes partial derivative of activation with respect to weight
return sigDeriv(this.sums[t][a.l][a.j].val)*this.pdSum(a, w, t);
}
private pdSum(a : Activation, w : Weight, t : number) : number { //Handles sum statement in recursive derivative definition
if(a.l == w.l) return this.activations[t][a.l - 1][w.k].val; //This line solves the problem
return sumFunc(this.activations[t][a.l - 1].length, 1,
async k => await this.weights[a.l][a.j][k].val*this.pd(this.activations[t][a.l - 1][k], w, t)
);
}