每日最新頭條.有趣資訊

親耳“聽見”神經網絡的聲音:梯度變化一聽即可辨別

新智元報導

來源:Reddit等

編輯:金磊、鵬飛

【新智元導讀】訓練神經網絡可以用聽的!Reddit網友做了一個非常有趣的實驗:將每個神經網絡層梯度範式轉換成了一個音調,這樣人類就可以憑借聽覺,來很好的分辨出非常小的干擾,比如節奏和音調。

訓練神經網絡還可以用“聽”的!

網友做了一個非常有趣的實驗:將每個神經網絡層梯度範式轉換成了一個音調,這樣人類就可以憑借聽覺,來很好的分辨出非常小的干擾,比如節奏和音調。

以往,我們在訓練神經網絡的時候,通常會測量許多不同的指標,例如精度、損失以及梯度等等。這些工作大部分是在TensorBoard上聚合上述度量指標並且繪製可視化。

但除了視覺之外,有Reddit網友提出:用聽覺也可以監控神經網絡的訓練

部落格地址:

http://blog.christianperone.com/2019/08/listening-to-the-neural-network-gradient-norms-during-training/

聲音是目前神經網絡訓練中研究較少的一個方向。人類的聽覺可以很好的分辨出非常小的干擾(即使這些干擾時間很短或很細微),比如節奏和音高。

在這個實驗中,研究者做了一個非常簡單的例子,顯示了使用每層的梯度范數進行的合成聲音,以及使用不同設置(如不同學習率、優化器,動量等)對MNIST進行卷積神經網絡訓練的步驟等。

看到這個結果,Reddit網友嗨了,紛紛開發腦洞。

MLApprentice

這真太了不起了。我一直在尋找直觀體驗漸變的方法,我覺得只看直方圖時很難注意到訓練模式。你有沒有想過用圖層深度來控制音高並使用音量來表示規範呢?這樣我們光靠聽音高就能知道是第幾層了。

klaysDoodle

10層網絡以後,我聾了

MLApprentice

樓上你太搞笑了。你可以將深度標準化,使其保持在人類聽覺範圍內就可以。

gohu_cd

很有意思!我想知道這是否有助於調試神經網絡訓練。因為其中存在不同的加權損失,甚至是對抗的(例如GAN)。因為視覺和聽覺都是感官,查看圖表或聽覺聲音應該具有相同數量的信息。可以用對應於加權梯度的所有聲音創建一個“交響樂”,也許這對於確定每個損失的正確權重是有用的。

在下文給出的實驗中,你需要安裝PyAudio和PyTorch來運行代碼。

“聽見”神經網絡的聲音

如下訓練神經網絡的聲音可跳轉至下方鏈接聽:

http://blog.christianperone.com/2019/08/listening-to-the-neural-network-gradient-norms-during-training/

用LR 0.01和SGD訓練聲音

下面這個音頻片段表示在第一個epoch的前200步中使用4個層的梯度,並使用10個batche大小的訓練會話。音高越高,一個神經網絡層的標準值就越高,不同的batche之間會有短暫的靜音。

用LR 0.1的SGD訓練聲音

同上,但是學習率更高了。

用LR 1.0的SGD訓練聲音

同上,但是隨著學習率的提高,神經網絡產生發散(diverge)。

用LR 1.0、BS 256的SGD訓練聲音

設置是相同的,但是學習率高達1.0,batche大小為256。

用LR 0.01的Adam訓練聲音

與SGD的設置相同,但使用的是Adam。

源代碼展示

以下是實驗的全部源代碼,有興趣的讀者可以上手試一下。

1importpyaudio

2importnumpyasnp

3importwave

4

5importtorch

6importtorch.nnasnn

7importtorch.nn.functionalasF

8importtorch.optimasoptim

9fromtorchvisionimportdatasets, transforms

10

11

12classNet(nn.Module):

13def__init__(self):

14super(Net, self).__init__()

15self.conv1 = nn.Conv2d(1,20,5,1)

16self.conv2 = nn.Conv2d(20,50,5,1)

17self.fc1 = nn.Linear(4*4*50,500)

18self.fc2 = nn.Linear(500,10)

19

20self.ordered_layers = [self.conv1,

21self.conv2,

22self.fc1,

23self.fc2]

24

25defforward(self, x):

26x = F.relu(self.conv1(x))

27x = F.max_pool2d(x,2,2)

28x = F.relu(self.conv2(x))

29x = F.max_pool2d(x,2,2)

30x = x.view(-1,4*4*50)

31x = F.relu(self.fc1(x))

32x = self.fc2(x)

33returnF.log_softmax(x, dim=1)

34

35

36defopen_stream(fs):

37p = pyaudio.PyAudio()

38stream = p.open(format=pyaudio.paFloat32,

39channels=1,

40rate=fs,

41output=True)

42returnp, stream

43

44

45defgenerate_tone(fs, freq, duration):

46npsin = np.sin(2* np.pi * np.arange(fs*duration) * freq / fs)

47samples = npsin.astype(np.float32)

48return0.1* samples

49

50

51deftrain(model, device, train_loader, optimizer, epoch):

52model.train()

53

54fs =44100

55duration =0.01

56f =200.0

57p, stream = open_stream(fs)

58

59frames = []

60

61forbatch_idx, (data, target)inenumerate(train_loader):

62data, target = data.to(device), target.to(device)

63optimizer.zero_grad()

64output = model(data)

65loss = F.nll_loss(output, target)

66loss.backward()

67

68norms = []

69forlayerinmodel.ordered_layers:

70norm_grad = layer.weight.grad.norm()

71norms.append(norm_grad)

72

73tone = f + ((norm_grad.numpy()) *100.0)

74tone = tone.astype(np.float32)

75samples = generate_tone(fs, tone, duration)

76

77frames.append(samples)

78

79silence = np.zeros(samples.shape[] *2,

80dtype=np.float32)

81frames.append(silence)

82

83optimizer.step()

84

85# Just 200 steps per epoach

86ifbatch_idx ==200:

87break

88

89wf = wave.open("sgd_lr_1_0_bs256.wav",'wb')

90wf.setnchannels(1)

91wf.setsampwidth(p.get_sample_size(pyaudio.paFloat32))

92wf.setframerate(fs)

93wf.writeframes(b''.join(frames))

94wf.close()

95

96stream.stop_stream()

97stream.close()

98p.terminate()

99

100

101defrun_main():

102device = torch.device("cpu")

103

104train_loader = torch.utils.data.DataLoader(

105datasets.MNIST('../data', train=True, download=True,

106transform=transforms.Compose([

107transforms.ToTensor(),

108transforms.Normalize((0.1307,), (0.3081,))

109])),

110batch_size=256, shuffle=True)

111

112model = Net().to(device)

113optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)

114

115forepochinrange(1,2):

116train(model, device, train_loader, optimizer, epoch)

117

118

119if__name__ =="__main__":

120run_main()

Reddit地址:

https://www.reddit.com/r/MachineLearning/comments/clyzgx/p_listening_to_the_neural_network_gradient_norms/

部落格:

http://blog.christianperone.com/2019/08/listening-to-the-neural-network-gradient-norms-during-training/

獲得更多的PTT最新消息
按讚加入粉絲團