/// <summary> /// Propagates a weight update event upstream through the network. /// </summary> /// <param name="properties">Network training properties.</param> /// <param name="networkTrainer">Network training method.</param> public override void Update(NetworkTrainingProperties properties, INetworkTrainer networkTrainer) { double lm = (properties.Lambda / (int)properties[nameof(GatedRecurrentGenerator.SequenceLength)]); if (!this.Constrained) { this.Rx = networkTrainer.Update(this.NodeId, this.NodeId, nameof(this.Rx), this.Rx, this.DRx, properties); this.Rh = networkTrainer.Update(this.NodeId, this.NodeId, nameof(this.Rh), this.Rh, this.DRh, properties); this.Zx = networkTrainer.Update(this.NodeId, this.NodeId, nameof(this.Zx), this.Zx, this.DZx, properties); this.Zh = networkTrainer.Update(this.NodeId, this.NodeId, nameof(this.Zh), this.Zh, this.DZh, properties); this.Hh = networkTrainer.Update(this.NodeId, this.NodeId, nameof(this.Hh), this.Hh, this.DHh, properties); } for (int edge = 0; edge < this.In.Count; edge++) { Delta = (1.0 / properties.Examples) * Delta; if (!this.In[edge].Source.IsBias) { Delta = Delta + (lm * this.In[edge].Weight); } if (!this.Constrained) { this.In[edge].Weight = networkTrainer.Update(this.In[edge].ParentId, this.In[edge].ChildId, nameof(Edge.Weight), this.In[edge].Weight, Delta, properties); } this.In[edge].Source.Update(properties, networkTrainer); } }
/// <summary> /// Propagates a weight update event upstream through the network. /// </summary> /// <param name="properties">Network training properties.</param> /// <param name="networkTrainer">Network training method.</param> public virtual void Update(NetworkTrainingProperties properties, INetworkTrainer networkTrainer) { for (int edge = 0; edge < this.In.Count; edge++) { Delta = (1.0 / properties.Examples) * Delta; if (edge > 0) { Delta = Delta + ((properties.Lambda / properties.Examples) * this.In[edge].Weight); } if (!this.Constrained) { this.In[edge].Weight = networkTrainer.Update(this.In[edge].ParentId, this.In[edge].ChildId, nameof(Edge.Weight), this.In[edge].Weight, Delta, properties); } this.In[edge].Source.Update(properties, networkTrainer); } }