Technologieaustausch

[PyTorch] Torch.fmod verwendet eine abgeschnittene Normalverteilung, um die Gewichte des neuronalen Netzwerks zu initialisieren

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Dieser Codeausschnitt zeigt, wie die Gewichte eines neuronalen Netzwerks mit PyTorch unter Verwendung der abgeschnittenen Normalverteilung initialisiert werden. Eine abgeschnittene Normalverteilung bedeutet, dass die generierten Werte innerhalb eines Bereichs abgeschnitten werden, um Extremwerte zu verhindern.hier verwendettorch.fmod Als Workaround, um diesen Effekt zu erzielen.

Ausführliche Erklärung

1. Abgeschnittene Normalverteilung

Die abgeschnittene Normalverteilung ist eine Modifikation der Normalverteilung, die sicherstellt, dass die generierten Werte in einen bestimmten Bereich fallen. Speziell,torch.fmod Die Funktion gibt den Rest des Eingabetensors dividiert durch 2 zurück (d. h. so, dass der resultierende Wert zwischen -2 und 2 liegt).

2. Gewichtsinitialisierung

Im Code werden die vier Gewichtungstensoren nach unterschiedlichen Standardabweichungen berechnet (init_sd_first, init_sd_middle, init_sd_last ) wird aus einer abgeschnittenen Normalverteilung generiert. Die spezifischen Abmessungen sind:

  • Die Form des Gewichtstensors der ersten Schicht ist (x_dim, width n_double)
  • Die Form der beiden Gewichtstensoren der mittleren Schicht ist (width, width n_double)
  • Die Form des Gewichtstensors der letzten Schicht ist (width, 1)

Diese Gewichtstensoren werden wie folgt generiert:

initial_weights = [
    torch.fmod(torch.normal(0, init_sd_first, size=(x_dim, width   n_double)), 2),
    torch.fmod(torch.normal(0, init_sd_middle, size=(width, width   n_double)), 2),
    torch.fmod(torch.normal(0, init_sd_middle, size=(width, width   n_double)), 2),
    torch.fmod(torch.normal(0, init_sd_last, size=(width, 1)), 2)
]