Brecht Coghe recurrente neurale netwerken het leren van

advertisement
het leren van hiërarchieën van tijdsschalen met diepe
recurrente neurale netwerken
Brecht Coghe
Promotor: prof. dr. ir. Benjamin Schrauwen
Begeleiders: dr. ir. Michiel Hermans, Philémon Brakel
Masterproef ingediend tot het behalen van de academische graad van
Master of Science in Engineering Physics
Vakgroep Elektronica en Informatiesystemen
Voorzitter: prof. dr. ir. Jan Van Campenhout
Faculteit Ingenieurswetenschappen en Architectuur
Academiejaar 2013-2014
het leren van hiërarchieën van tijdsschalen met diepe
recurrente neurale netwerken
Brecht Coghe
Promotor: prof. dr. ir. Benjamin Schrauwen
Begeleiders: dr. ir. Michiel Hermans, Philémon Brakel
Masterproef ingediend tot het behalen van de academische graad van
Master of Science in Engineering Physics
Vakgroep Elektronica en Informatiesystemen
Voorzitter: prof. dr. ir. Jan Van Campenhout
Faculteit Ingenieurswetenschappen en Architectuur
Academiejaar 2013-2014
Voorwoord
Bij het maken van deze thesis heb ik veel bijgeleerd over neurale netwerken en machinaal leren in
het algemeen en is mijn interesse voor dit onderwerp sterk gegroeid. De thesis wordt ingediend
om de Master in Physical Engineering te behalen. Bij dit werk werd ik ondersteund door de
vakgroep ELIS - reservoir lab, UGENT. Bij deze wil ik graag hun medewerkers bedanken:
Dr. Ir. Michiel HERMANS voor het begeleiden bij de taken, de vele bijkomende uitleg en het
helpen zoeken naar oplossingen voor problemen.
Prof. Dr. Ir. Benjamin SCHRAUWEN voor het promoten van deze thesis en voor het gebruik
van de middelen van reservoir lab.
”De auteur geeft de toelating deze masterproef voor consultatie beschikbaar te stellen en delen van de masterproef te kopiren voor persoonlijk gebruik. Elk ander gebruik valt onder de
beperkingen van het auteursrecht, in het bijzonder met betrekking tot de verplichting de bron
uitdrukkelijk te vermelden bij het aanhalen van resultaten uit deze masterproef.”
Brecht Coghe, 11 juni 2014
Het leren van hiërarchieën van tijdsschalen
met
diepe recurrente neurale netwerken
door
Brecht COGHE
Thesis ingediend tot het behalen van de academische graad van
master in Physical Engineering
Academiejaar 2013–2014
Promotor: Prof. Dr. Ir. B. SCHRAUWEN
Thesisbegeleider: Dr. Ir. M. HERMANS
Faculteit Ingenieurswetenschappen
Universiteit Gent
Vakgroep ELIS-reservoir lab
Samenvatting
Een onderdeel van het gebied machinaal leren is neurale netwerken. Deze thesis onderzoekt in het
bijzonder de combinatie van een diep en een recurrent neuraal netwerk als ’nieuwe’ architectuur.
Aan de hand van twee taken worden de voordelen en nadelen van zo’n diep recurrent neuraal
netwerk bekeken. De eerste taak situeert zich in de spraaktechnologie. Er wordt gebruik gemaakt
van de TIMIT-dataset. De tweede taak werkt met symbolische muziek (MIDI) en gebruikt een
eigen dataset.
Trefwoorden
Deep Recurrent Neural Networks TIMIT MIDI
Learning temporal hierarchies with deep recurrent
neural networks
Brecht Coghe
Supervisor(s): Dr. Michiel Hermans, Prof. Benjamin Schrauwen
Abstract— In this article we explain Deep Recurrent Neural Networks
(DRNNs) and how to train them. The DRNNs are a combination of the
commonly used Recurrent Neural Networks and the Deep Neural networks.
We hope to show that the deeper version of the Recurrent Neural Network
can cope with more complex data and the different layers show a hierarchy
in time, corresponding with the layers in a deep neural network who can
learn a hierarchy in the data. To do this we use the TIMIT speech recognition dataset and a self-made music dataset in MIDI-format.
Keywords— Deep recurrent neural networks, TIMIT, artificial music
generation
output is calculated as:
y = g(A h)
(2)
Here the output weights ai are compiled in one matrix A. The
same goes for the activations of the different neurons, this vector
is called h. The output-function g is chosen in respect to the
task. A neural network is trained by changing its weights to
produce an output y that is as close to the target t as possible.
I. I NTRODUCTION
EURAL Networks are an important part of machine learning. Machine learning is the subject of letting a computer
learn by itself from data. Some examples are Computer vision,
speech recognition, brain-computer interfaces, sentiment analysis etc [1][2][3][4].
The object in machine learning is to generalise from the data,
in other words, the trained program should be able to process
unseen data. A Neural network is a composition of different artificial neurons. These neurons are a strong abstraction of the
neurons in our brains. One can be seen at Figure 1. To learn
from data, they use a supervised training method. They get input vectors x and the target outputs t to learn by example. If sufficient data is given the neural network is able to make a model
for the task at hand.
N
Fig. 2. Single-layered Neural Network
Two variations to this single-layered NN are the Deep NN (Figure 3) and the recurrent NN. A Deep NN consists of different
layers of neurons stacked onto each other. These layers are connected to each other with their own weight matrices Vi and one
layer uses the activations of the preceding layer as inputs. This
deep structure provides a more hierarchical structure and makes
it possible to model more complex data. These deep networks
have made an improvement possible in different applications,
such as image processing, classification and speech recognition
[5].
Fig. 1. Schematic presentation of an artificial neuron
An artificial neuron has an activation value h calculated as:
h = f(
N
X
vi xi )
(1)
i=1
Where the vi are the so called weights and the function f is an
activation function. In what follows we use the tanh-function.
The simplest Neural Network consists of one layer of hidden
neurons as can be seen in Figure 2. The hidden layer of neurons
produces an output in an analogue way as the neurons. The
Master student applied physics, Ghent University (UGent), Gent, Belgium.
Fig. 3. Deep Neural Network
One problem with the Deep NN is to cope with sequential data.
In a sequence there is a certain causality. The current data point
depends on the ones coming before that. But it’s not always that
easy to see how long this dependency should be. Therefore, it
is difficult to find the amount of data points one should use as
input in the deep NN to make use of this causal dependency.
A recurrent NN tackles this problem in a different way. In its
architecture there is an implicit context as can be seen in Figure 4. Every timestep is made up of the same single-layered
neural network and these are connected in time by the so-called
Recurrent Weights W . These recurrent connections carry the
history of all preceding timesteps. The activations on timestep t
are now calculated as:
h(t) = tanh(V x(t) + W h(t−1) )
weight matrices V , W and A in every timestep. These are averaged and are then used to upgrade the weight matrices.
(3)
and thus depend on the activation of the neural layer one step
back in time.
Fig. 5. Schematic of BPTT: The error in red is propagated back through the
network and back in time.
II. D EEP R ECURRENT NN S
Fig. 4. Simplified schematic of a RNN. Every circle presents a complete layer.
Blue are inputs, black are hidden neuron layers and green is an output layer.
To train a simple or deep neural network, we use gradient descent. With each iteration we want to change the weights in the
direction of a decreasing cost-function. The cost-function E is
a measure for the difference between the generated output y of
the networks and the given targets t. The gradient of this function with respect to the weights gives us the direction in which
to step to decrease it. The update equation thus becomes:
W (t+1) ← W (t) − η ∇E(W (t) )
(4)
Where W stands for all the weight matrices and η is the learning
speed. To calculate this gradient, we use the backpropagation algorithm. Briefly it can be explained as followed: We generate a
graph from the schematic of the NNs. Every layer is a node and
every weight matrix forms a connection between nodes. Then
the error at the output is being calculated as y − t. This error can
be propagated back through the network by multiplying it with
the transposed weight matrix of that connection. In this way, an
error can be calculated in every node. If two connections reach
a node, these errors have to be added before propagating further
back. Once all nodes have their errors calculated, the gradient of
a weight matrix can be calculated as the outer product between
the input of the connection and the error at the end of it. For a
more formal derivation we refer to [6].
A recurrent network can be trained in a simular way. If we unfold it in time, we can see that the recurrent NN can be seen as
a deep NN and thus we can use the Backpropagation Through
Time (BPTT) algorithm here which is mainly the same as before. Note that here the error should also be backpropagated
through the recurrent connections. BPTT is schematicly depicted in Figure 5. In this way we calculate a gradient for the
Even though the Recurrent NN made some nice improvements
on some tasks, it still has some shortcomings. First of all, in
one timestep, the input goes through only one layer to reach the
output. Some data will thus be to complex to get a good model
off, as one layer won’t be able to cope with this data. A second
problem is that a hierarchy isn’t explicitly inherent in the network architecture. Some tasks will, though, require a temporal
hierarchy to be dealt with.
These problems make it clear to us that we need to make the recurrent NN deeper. To do that, we stack several recurrent layers
onto each other as in Figure 6 . By doing this, we make the network deeper in space. There are now more layers between the
input and the output.
Fig. 6. Schematic of a deep recurrent network with three layers.
The shortcomings (and solutions for them) of a Recurrent NN
have already been proposed by some people. One way to get
a higher context is proposed in [7]. They combine a recurrent
NN with LSTM or long-short term memory[8]. These are special memory blocks who can be trained to remember activations
or data from far away in time. They are explicitly present in
the architecture. They also stacked these LSTM-RNN layers on
top of each other to make a LSTM-DRNN. These are then used
on the TIMIT speech recognition database to get state-of-the-art
performances, but there is room for a better analysis of these
networks. In [9], the same networks are used but now to generate handwriting and do text prediction. Again these networks
perform very well.
In [10] different architectures are proposed and tested to make
a Recurrent NN deeper. Again, state-of-the-art performances
are achieved, this time in music prediction and language modelling. In [11] the DRNNs we use are introduced and applied
on a wikipedia dataset to do text prediction. With a far simpler
training algorithm, it still achieves better performances than a
so-called mRNN (up till then the best RNN performance on this
task) that is trained with a second order training algorithm. Furthermore an analysis has been carried out to look at the functionality of the different layers. One can see that closing brackets (which happens on a different time scale than the usual text
prediction), is accounted for by the highest layer in the network.
Which is a promising result.
The objective of this thesis would thus be to show that more layers equal a higher performance of the tasks and to analyse what
caused this. Furthermore, we like to investigate if a higher layer
also takes into account a longer timeframe.
The calculations to generate an output with the DRNN are not
much more complicated than with a normal RNN. To be clear,
we’ll go over it briefly. With every time step, there are now
different input, recurrent and output weight matrices as can be
seen in Figure 7. The activations of the neuron layers can now
be calculated as:
(t+1)
hj
(t)
(t+1)
= f (Wj hj + Vj h(j−1) )
(5)
where the upper indices are time indices and the lower indices
indicate the layers. The output is now generated by the sum of
all connections to the output:
X
(t)
y (t) = g(
Aj hj )
(6)
j
To train the network we can still use the stochastic gradient descent method with backpropagation through time. Notice that
every neuron layer also gets an error propagated from the output
directly, that should be added with the other errors.
III. TIMIT
Fig. 7. A three-layered DRNN zoomed in on one timestep. Note that in every
neural layer there should arrive connections too. As they would have the
same weight matrices Wi they are not drawn.
weight matrices have to be searched here. To get the best metaparameters we sweep over a validation set of about 10% of the
training data. This data isn’t used to train on first, but is used to
see how well the DRNN with certain metaparameters performs
on unseen data. The metaparametes that perform best on this
validation set are chosen and the network is trained again on the
complete training data (including the validation set).
B. Results
To compare DRNNs with a different amount of layers, we need
to find an honest way to do it. Here, we have chosen to use the
same amount of weight parameters (amount of all elements of
the weight matrices). In the TIMIT application we used about
400000. This gives the following amount of neurons per layer
for the different DRNNs:
Amount of layers
Neurons per layer
1
600
2
348
3
269
4
227
5
200
The first application we tested our DRNN on is the speech
recognition dataset TIMIT [12]. The dataset contains about one
million training samples which are 39-dimensional. The targets
are phonemes and are manually labeled, also 39-dimensional.
We now want our DRNN to classify our inputs. Therefore we
calculate the output with the softmax as an output function. This
gives us the probability of belonging to the k th class. We choose
the class with the highest probability and compare it with the
targets. The error rate we use is the ratio of the amount of missclassified phonemes on the total amount of classified phonemes.
As 1M datapoints is to many to calculate all at once, we use
a batch containing 50 randomly chosen datapoints per iteration
(this is stochastic gradient descent). We also need to use the
same metaparameters for all the DRNNs so they don’t influence
the results relative to each other: The learning speed is set at 0.1
and let it decrease to zero lineary over all iterations, we use 1.5M
iterations, we choose the initialisation of the input weights randomly out of a normal distribution between −0.005 en 0.005,
the recurrent weights are initialised in the same way, but now
we take a normal distribution between -1 and 1 divided by the
square root of the amount of neurons in the layers. The output
weights are set to 0 to start the learning proces.
To train our DRNN we need to search the best metaparameters. They can influence the performance of the network. Learning speed, the amount of iterations and the initialisation of the
After training the networks, we save them and use them to find
the performance on the given test set. The results are shown
below:
A. Training
Amount of layers
Testerror
1
0.285
2
0.281
3
0.279
4
0.276
5
0.275
We see that the results fit our objective. Indeed, the testerror
goes down with an increasing amount of layers. To analyse what
made this possible, we want to make an estimation of the context
that each layer harnasses. To do this, we will again use a training
method. But this time we use the trained DRNN with 5 layers
and we train a desired input for a certain target. The same way
as we used the backpropagation algorithm, we can calculate the
error on the input and change the input accordingly. The error
propagated through the network consists only of the error in the
current timestep. As we want a desired input for the target at
time t, the errors past in time don’t matter. We depicted this
method in Figure 8. Note that to make a distinction between
each layer, we propagate the error from the output only to the
layer that is being analysed and not to all layers.
Fig. 9. Estimated context for different layers: We see a longer context in higher
layers
the other layers. The analysis of the DRNNs with a different
amount of layers, trained on the TIMIT-dataset meets thus our
objectives.
Fig. 8. Training of the desired input follows three steps: 1) The error of the
current timestep(node on the right) is being propagated back from the output
to the analysed layer (here the second layer) (upper side). 2) The error is
being propagated to the input (bottom side). 3) The input is being updated
and the process repeats itself
Fig. 10. Targetphoneme 8. From left-upper side to right-bottom side: A real
input, Desired input from layer 1 to 5.
IV. M USIC MODELLING
A. training
We did this training proces with a learning speed of 0.1 and used
1000 iterations. The input is initialised at a random training data
sequence. Ridge regression is used to be sure the data back in
time that doesn’t matter, is set to zero after training. The resulting desired inputs are averaged over different targets and are
normalised to 1. That way we can see the relative differences.
Results of this estimation of the context is seen in Figure 9.
The results are promising, we observe that the desired input is
bigger back in time for the higher layers. This gives us the estimation that the context of this layer would also be bigger. And
thus the analysis of this application is positive. As a last experiment we can have a look at the difference in desired input
for each layer. The absolute values of the of the desired input
are shown in figure 10. It’s also noteable in this Figure how
the desired input of the fifth layer is larger back in time than in
The next application for our DRNNs is music modelling. Some
nice results have already been obtained useing LSTMs in combination with RNN [13][14]. But we want the time dependency
to be modelled implicitly in our network. Not with some special
memory blocks. To do that, we made our own dataset consisting
out of 106 classical piano works in MIDI-format. MIDI-format
tells us when a note is on/off. So to produce a proper input
for these files we made a time roster with 25 steps per second.
When a note is on at the current timestep, it gets value 1 in its
row. When a note is off, it gets value zero. We repeated this
proces each 0.04 seconds. A smaller sample rate would mean a
loss of information, as the spaces between the same note being
on can be very small, and they would be modelled as one long
note instead of two short ones.
The targets here are the input of the next timestep. In this way
we want to make a predictive neural network. Some little adjustments have to be made to the training in comparison with
the TIMIT application. First of all, several notes can be played
at the same time. Therefore, the softmax output function isn’t
appropiate anymore because it favors one class in particular. To
tackle this problem, we use a sigmoid output function for every
channel (=note). The output then is a probability for every note
seperatly that it is on or off. The same goes for the performance
rate. As error we use the cross-entropy error, this is a measure
to see how well the generated output probabilities overlap with
the targets.
Again, by sweeping the metaparameters over a validation set (10
% of the training data), we gain the settings to train the DRNNs
to best performance. The learning speed is chosen as 0.5 and
decreases to zero over 20000 iterations. We initialised the recurrent weights the same way as we did in the TIMIT-application.
The input weights are initialised by taking random numbers in [0.1;0.1] and the output weights by random numbers in [-2;2]. If
we start by setting the output weights at 0, we notice that we get
the same probability for all notes on all times which is far from
the ideal training. As size of the batch on which is trained every
iteration we chose 500 timesteps (20 seconds). This is rather
large, but to learn rythm out of music we deem this necessary.
Fig. 11. Relative desired inputs
longest. But it’s only 30 timesteps, which is 1.2 seconds. That’s
not nearly enough to predict rythms in music. If we compare
the output of the network to the targets we see that the output
lags behind one timestep to the targets(f.e. Figure 12). The network thus didn’t learn to predict rhythms but seems to copy the
last timestep. We didn’t succeed in learning the DRNN the right
context to make changes in notes on to off on the right times.
B. results
To compare DRNNs with a different amount of layers we again,
choose to take the same amount of total weight parameters. In
this case there are about 167000. This corresponds to the following amount of neurons N per layer:
Amount of layers
Neurons per layer
1
300
2
180
3
138
4
115
5
100
In the following table, we see the validation cross-entropy errors. We again notice an improvement in performance. The
error goes from 0.039 for a one-layered DRNN to 0.023 for a
five-layered DRNN. A positive result which again shows us the
power of these DRNNs. Note, though, that the forth and fifth
layers don’t improve the error as much as the addition of the
first two.
Amount of layers
Validation error
1
0.039
2
0.027
3
0.025
4
0.024
Fig. 12. Comparison between output probabilities and targets
5
0.023 Even by training the network with a different error, the results
stay the same. The different error used here had to focus on the
To analyse where this improvement comes from, we calculate changes between note on and off. In a timestep a note changed,
the desired input of the different layers as before. As regression- the error was multiplied with [5,10,100]. These errors thus had
parameter we chose 10−4 here. The result is seen in Figure 11. to be far more important in the training proces.
For the first three layers we see the result we wanted. The higher
the layer, the longer in time it goes back to predict the current
time step. Strange results, though, are seen with the desired input of the forth and fifth layer. They seem to take every timestep
in account in an equal way. If we investigate this further, we see
that the desired input of the forth and fifth layer are nearly equal
to zero in every timestep. In other words, it seems to be so that
these layers are abundant.
If we look at Figure 11 we see that in the third layer the context is
C. Generating music
As a last experiment we tried to generate music with the trained
network. By sampling from the output probabilities, we gain the
input for the next step. After an initialisation of 1200 timesteps
we let the network generate music of its own. An example is
seen in Figure 13. We see that almost immediatly after the initialisation, the network goes out of control and generates chaos.
There is no rhythm to be seen in it. If we zoom in to the
timesteps around the end of the initialisation, we see that the first
few timesteps, the network performs realistic, but afterwards it
can’t correct ‘mistakes’ which lead to the result later on.
ACKNOWLEDGMENTS
The author of this abstract would like to thank Dr. M. Hermans
for the aid in the research done and Prof. B. Schrauwen for
promoting this thesis. Also I’d like to thank the University of
Ghent, especially the reservoir lab for its time and devotion.
R EFERENCES
[1]
[2]
Fig. 13. Generated music of the network. The initialisation stops at timestep
1200.
[3]
[4]
[5]
[6]
[7]
[8]
Fig. 14. Generated music zoomed in around the end of the initialisation. Initialisation stops at timestep 100.
V. C ONCLUSION
Deep Recurrent Neural Networks are a powerful tool and an expansion of a common recurrent neural network. It seems to outperform them by looking in a more hierarchical way in time.
This has been tested in two applications. In the TIMIT speech
recognition application the results are promising: performances
improve and each layer has a bigger context, or so it seems by
the desired input of each layer.
The more difficult music modelling task has less ideal results.
Though, we have an improvement in performance and a rise in
context from layer 1 to 3. It seems that the network is not doing
what it is supposed to do and is just copying the last timestep.
We can conclude from it that training DRNNs (and NN in general) still has limits in the tasks it can complete.
[9]
[10]
[11]
[12]
[13]
[14]
Paul Viola and Michael Jones, “Rapid object detection using a boosted
cascade of simple features,” in Computer Vision and Pattern Recognition,
2001. CVPR 2001. Proceedings of the 2001 IEEE Computer Society Conference on. IEEE, 2001, vol. 1, pp. I–511.
Lawrence Rabiner, “A tutorial on hidden markov models and selected
applications in speech recognition,” Proceedings of the IEEE, vol. 77, no.
2, pp. 257–286, 1989.
Anirudh Vallabhaneni, Tao Wang, and Bin He, “Braincomputer interface,”
in Neural Engineering, pp. 85–121. Springer, 2005.
Bo Pang, Lillian Lee, and Shivakumar Vaithyanathan, “Thumbs up?:
sentiment classification using machine learning techniques,” in Proceedings of the ACL-02 conference on Empirical methods in natural language
processing-Volume 10. Association for Computational Linguistics, 2002,
pp. 79–86.
Yann LeCun and Yoshua Bengio, “Convolutional networks for images,
speech, and time series,” The handbook of brain theory and neural networks, vol. 3361, 1995.
Christopher M Bishop et al., Pattern recognition and machine learning,
vol. 1, springer New York, 2006.
Alex Graves, Abdel-rahman Mohamed, and Geoffrey Hinton, “Speech
recognition with deep recurrent neural networks,” in Acoustics, Speech
and Signal Processing (ICASSP), 2013 IEEE International Conference on.
IEEE, 2013, pp. 6645–6649.
Sepp Hochreiter and Jürgen Schmidhuber, “Long short-term memory,”
Neural computation, vol. 9, no. 8, pp. 1735–1780, 1997.
Alex Graves, “Generating sequences with recurrent neural networks,”
arXiv preprint arXiv:1308.0850, 2013.
Razvan Pascanu, Caglar Gulcehre, Kyunghyun Cho, and Yoshua Bengio, “How to construct deep recurrent neural networks,” arXiv preprint
arXiv:1312.6026, 2013.
Michiel Hermans and Benjamin Schrauwen, “Training and analysing deep
recurrent neural networks,” in Advances in Neural Information Processing
Systems 26, C.J.C. Burges, L. Bottou, M. Welling, Z. Ghahramani, and
K.Q. Weinberger, Eds., pp. 190–198. Curran Associates, Inc., 2013.
John S Garofolo, Lori F Lamel, William M Fisher, Jonathon G Fiscus, and
David S Pallett, “Darpa timit acoustic-phonetic continous speech corpus
cd-rom. nist speech disc 1-1.1,” NASA STI/Recon Technical Report N, vol.
93, pp. 27403, 1993.
Judy A Franklin, “Jazz melody generation from recurrent network learning
of several human melodies.,” in FLAIRS Conference, 2005, pp. 57–62.
Douglas Eck and Jürgen Schmidhuber, “Learning the long-term structure
of the blues,” in Artificial Neural NetworksICANN 2002, pp. 284–289.
Springer, 2002.
INHOUDSOPGAVE
i
Inhoudsopgave
1 Inleiding
1
1.1
Machinaal leren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.2
Neuronen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
1.3
Neurale netwerken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
1.3.1
Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
1.4
Diepe recurrente neurale netwerken . . . . . . . . . . . . . . . . . . . . . . . . . .
5
1.5
Verdere verloop thesis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2 Neurale netwerken
7
2.1
Het artificiële neuron en éénlagig netwerk . . . . . . . . . . . . . . . . . . . . . .
7
2.2
Diepe neurale netwerken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
2.3
Recurrente neurale netwerken . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
2.4
Het backpropagation algoritme . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
2.4.1
Gradient descent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
2.4.2
Error backpropagation . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
2.4.3
Backpropagation bij Diepe Neurale Netwerken . . . . . . . . . . . . . . .
17
2.4.4
Backpropagation Through Time . . . . . . . . . . . . . . . . . . . . . . .
18
Training . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
2.5.1
Stochastic Gradient Descent . . . . . . . . . . . . . . . . . . . . . . . . . .
21
2.5.2
Validatieset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
2.5.3
Initialisatie gewichten . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
2.5.4
Leersnelheid + aantal iteraties . . . . . . . . . . . . . . . . . . . . . . . .
24
Samengevat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
2.5
2.6
INHOUDSOPGAVE
ii
3 Diepe Recurrente neurale netwerken
26
3.1
Tekortkomingen recurrente neurale netwerken . . . . . . . . . . . . . . . . . . . .
26
3.2
Concept en doel DRNN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
3.3
Literatuur DRNN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
3.4
Werking DRNN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
4 Toepassing 1: TIMIT
31
4.1
training . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
4.2
Resultaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
4.2.1
Hoe vergelijken? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
4.2.2
Vergelijken prestatie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
4.2.3
Context . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
4.2.4
Vergelijken invoer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
Samengevat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
4.3
5 Toepassing 2: Symbolische muziek
41
5.1
introductie
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
41
5.2
Prestatie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
43
5.3
Alternatieve leermethode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
46
5.4
Voorspellen muziek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
5.5
Samengevat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
49
6 Conclusie
50
INLEIDING
1
Hoofdstuk 1
Inleiding
1.1
Machinaal leren
Machinaal leren, een tak van artificiële intelligentie, is het concept om een computerprogramma/
architectuur te laten leren van data. Het gebruikt deze data om taken uit te voeren. Arthur
Samuel gaf de definitie: “Field of study that gives computers the ability to learn without being
explicitly programmed” [Samuel, 1962]. Tom M. Mitchell gaf dan weer de meer formele definitie:
“A computer program is said to learn from experience E with respect to some class of tasks T
and performance measure P, if its performance at tasks in T, as measured by P, improves with
experience E”. [Mitchell, 1999]
Machinaal leren is dus een vorm van artifiële intelligentie. De meest voorkomende taken zijn regressie (het benaderen van een continue functie), classificatie en voorspellingen in een bepaalde
sequentie. Sommige van deze technieken proberen een menselijke kant te geven aan computerprogramma’s en vele toepassingen maken van deze technieken gebruikt. Om toch een paar
concretere voorbeelden te geven:
- Visuele dataverwerking met o.a. objectherkenning [Viola and Jones, 2001]
- Spraak- en handschriftherkenning [Rabiner, 1989]
- Brain-computer interfaces [Vallabhaneni et al., 2005]
- Gevoelsanalyse (bv. herkennen van positieve/negatieve reviews) etc. [Pang et al., 2002]
Een belangrijk punt in machinaal leren is generalisatie. Generalisatie betekent dat na het leren
van een model aan de hand van een trainingsdataset, het model ook de taak kan uitvoeren op
1.1 Machinaal leren
2
ongeziene data. De trainingsdataset zou dan uiteraard representatief moeten zijn voor zoveel
mogelijk ongeziene data.
Een neuraal netwerk is een aanéénschakeling van artificiële neuronen. Het is in staat om taken
uit te voeren die behoren tot het vakgebied van machinaal leren. Laten we starten met een
voorbeeld van wat zo’n neuraal netwerk doet. Handschriftherkenning is voor onze hersenen
een eenvoudige taak. Niemand heeft het moeilijk met het herkennen van de cijfers 504192 in
Figuur 1.1.
Figuur 1.1: handgeschreven cijfers
De moeilijkheid bij visuele patroonherkenning ligt nu wanneer men probeert een programma te
schrijven dat deze taak vervult. Terwijl wij het vanzelfsprekend vinden dat bijvoorbeeld een 9
een bolletje boven aan heeft met een staartje aan is dat onmogelijk te programmeren. Het blijkt
snel dat er te veel variatie zit in verschillende handschriften om een zo goed als altijd werkend
programma te creëeren.
De oplossing voor dit probleem is nu machinaal leren. In plaats van expliciet te programmeren
werkt het dus met voorbeelden. Met andere woorden gaat het dus de voorbeelden gebruiken om
automatisch zelf regels voor handschriftherkenning uit de data te onttrekken. Hoe meer data er
dus voor handen is, hoe beter de accuraatheid zal zijn. Daarvoor is een database opgemaakt:
de MNIST-database [LeCun and Cortes, 1998]. Deze bestaat uit 60000 trainingsafbeeldingen
en 10000 testafbeeldingen. Elk van deze afbeeldingen is een 28 × 28-pixel afbeelding van een
handgeschreven cijfer. State-of-the-art foutmarges met neurale netwerken liggen onder 0.5%.
Figuur 1.2: Voorbeelden uit de MNIST-database voor handgeschreven cijfers
1.2 Neuronen
3
Figuur 1.3: Schematische voorstelling artificieel neuron
1.2
Neuronen
Het menselijk brein is een van de wonderbaarlijkste dingen op onze planeet. Het is erg ingewikkeld en een krachtig gereedschap. De werking ervan is nog lang niet volledig verklaard, maar
de beginselen zijn al min or meer duidelijk. Het werkt met een constructie van neuronen in een
gigantisch netwerk waarbij die neuronen met elkaar zijn verbonden. Electro-chemische signalen
worden verzameld of verzonden van het ene naar het andere neutron over soms grote afstanden.
Zo worden ‘boodschappen’ gestuurd. Elk van deze neuronen kan zo geactiveerd worden. In een
neuron is de frequentie van het aantal activatie’s belangrijk om te kunnen werken. Des te meer
stimulans het neuron krijgt van verbonden neuronen, des te meer het neuron geactiveerd zal
worden.
Eén van de meest voorkomende abstracties is wanneer we gebruik maken van een activatie h
gedefinieerd als:
h = f(
N
X
wi x i )
(1.1)
i=1
Hierbij zijn de xi de stimulansen van de N neuronen die een invoer geven aan het betreffende
neuron en de wi zijn de bijhorende gewichten die een relatieve sterkte tussen de verschillende
invoeren tot stand kunnen brengen. De activatie is dan de functie een gewogen som van de
invoerstimulansen. Deze functie stelt voor hoe rap een neuron gaat vuren. In een biologisch
neuron zal vanaf een bepaalde drempelwaarde het neuron vuren. De functie f bij een artificieel
neuron zal veelal de biologische functie benaderen, maar onder een makkelijkere wiskundige
vorm. Voorbeelden zijn de sigmoı̈de functie en de tangens-hyperbolicus functie.
1.3 Neurale netwerken
1.3
1.3.1
4
Neurale netwerken
Types
Onder de term neurale netwerken verstaat men een breed gamma aan architecturen. Hieronder
worden de meest voorkomende en meest relevante voor deze thesis overlopen:
Eén verborgen laag: Dit netwerk bestaat uit één laag neuronen. Hieraan is een invoer verbonden
en een uitvoer zoals te zien is op Figuur 1.4. Dit één-lagig netwerk is het eenvoudigste neurale
netwerk. Met de invoer wordt in ieder neuron op een andere manier een gewogen som gemaakt,
waarna de activatiefunctie f erop inwerkt en ieder neuron een activatiewaarde krijgt. We kunnen
de invoergewichten schrijven als een matrix V . Daarna wordt met de activatiewaarden van de
neuronen opnieuw een gewogen som genomen om de uitvoer o te bekomen. Schrijven we de
uitvoergewichten als de matrix A dan bekomen we:
o = g(A f (V x))
(1.2)
Waarbij g een outputfunctie is die meestal lineair wordt gekozen. Merk nog op dat de activatiefunctie f niet-lineair moet zijn. Een lineaire combinatie van een lineaire combinatie is immers
terug een lineaire combinatie en zou deze functie overbodig maken. Het trainen van het netwerk
bestaat er dan in om de correcte gewichtenmatrices V en A te vinden om een zo goed mogelijke
uitvoer te bekomen.
1.4 Diepe recurrente neurale netwerken
5
Figuur 1.4: Links zien we een NN met één verborgen laag, rechts zien we een diepe architectuur
met meerdere lagen. Deze figuur is overgenomen van de doctoraatsthesis van M. Hermans met
toestemming.
Diepere structuren: Een diepere structuur is nu het op elkaar bouwen van deze tussenliggende
verborgen lagen neuronen. We zien dit rechts in Figuur 1.4. Deze structuur maakt het mogelijk
om complexere data en taken te verwerken aangezien de hiërarchische structuur van het netwerk makkelijker een hiërarchische structuur in data kan modelleren. Deze architectuur is vaak
moeilijker te trainen, maar daar komen we in volgend hoofdstuk op terug.
Recurrente netwerken: Deze architectuur is centraal in deze thesis. Bij sequentiële data is het zo
dat een context vaak belangrijk is. Een recurrent neuraal netwerk is een éénlagig netwerk ’in de
tijd’ waarbij de activatiewaarde van het vorige neuron in de tijd gebruikt wordt als extra invoer.
Dit zorgt voor een context-afhankelijkheid. We komen later uitgebreid terug op dit recurrente
netwerk.
1.4
Diepe recurrente neurale netwerken
In deze thesis onderzoeken we de mogelijkheden van een speciale architectuur van zo’n recurrent
neuraal netwerk, namelijk het diepe recurrent neuraal netwerk(of DRNN). De combinatie van
een diepe architectuur met een recurrent netwerk zou zo mogelijks extra complexiteit kunnen
modelleren in de tijd, analoog als de uitbreiding van een éénlagig neuraal netwerk naar een diep
1.5 Verdere verloop thesis
6
neuraal netwerk. Specifieker worden van twee taken (spraaktechnologie en Symbolische muziek
modelleren) gebruik gemaakt om dit onderzoek te doen.
1.5
Verdere verloop thesis
In het volgende hoofdstuk geven we een gedetailleerder overzicht van neurale netwerken in het
algemeen. Zowel de types, wiskundige werking als de trainingsalgoritme’s komen in dit hoofdstuk
aan bod. Net als de problemen die dat met zich kan meebrengen.
Het derde hoofdstuk gaat dan specifiek in op het Diepe Recurrente Neurale Netwerk waarbij
eerst wordt uitgelegd hoe een DRNN in elkaar zit, daarna overlopen we kort resultaten uit de
literatuur.
De twee laatste hoofdstukken handelen dan over het uitgevoerde onderzoek met deze DRNN’s.
Het vierde hoofdstuk gaat over de spraakherkenningstaak die wordt uitgevoerd op de TIMITdataset. Het vijfde hoofdstuk over de modellering van symbolische muziek a.d.h.v. een eigen
dataset. Om dan uiteindelijk tot een conclusie te komen.
NEURALE NETWERKEN
7
Hoofdstuk 2
Neurale netwerken
2.1
Het artificiële neuron en éénlagig netwerk
In hoofdstuk 1 hebben we de werking van een artificieel neutron al besproken en hebben we
kort vermeld hoe dit een éénlagig netwerk vormt. Om dit iets duidelijker te maken gaan we de
werking van dit éénlagig netwerk illustreren met een voorbeeld. In hoofdstuk 1 vermeldden we
de MNIST-dataset voor handschriftherkenning bij cijfers. Deze taak is eenvoudig om de werking uit te leggen. Het begint met de invoervector x. Zoals je kan zien is die samengesteld met
de invoeren xj . Voor de MNIST-afbeeldingen zou x een 785-dimensionale (28 × 28 + 1) input
worden. Met elke xj voor j ≤ 784 de grijswaarde van 1 pixel en een bias x785 die standaard op
1 wordt gezet. Op het nut van deze bias komen we verder terug.
Figuur 2.1: Eén-lagig neuraal netwerk horende bij MNIST handschriftherkenning
2.1 Het artificiële neuron en éénlagig netwerk
8
Om nu van deze invoer gebruik te maken gaan we aan iedere xj een gewicht meegeven,
namelijk wj en dat voor ieder neuron in het éénlagig netwerk. De gewichten zijn uiteraard
verschillend bij verschillende neuronen. De gewichten gaan bepalen hoe zeer een bepaalde input
(of pixel in het geval van MNIST) belangrijk is in de classificatie die het netwerk uitvoert. Het
is logisch dat een pixel in de rechterbovenhoek minder belangrijk zal zijn dan een pixel in het
midden. Het zijn tevens ook diezelfde gewichten die in het leerproces telkens aangepast worden.
n
P
In het k-de neuron wordt de lineaire combinatie
xj wjk gemaakt. Na de activatiefunctie f te
j=1
laten inwerken, bekomen we de activatie hk voor dit neuron. In matrixvorm wordt dit dan voor
alle neuronen h = f (W x) waarbij de activatiewaarden hk in de vector h en de gewichten voor
ieder neuron gebundeld worden in de matrix W . Om nu een uitvoer te bekomen herhalen we
ongeveer de vorige stap. We vermenigvuldigen nu met de uitvoergewichtenmatrix A en activeren
met een outputfunctie g. De uitvoer o wordt dan: o = g(A f (W x)).
In bijvoorbeeld classificatie is het nodig om een probabiliteit als uitvoer te verkrijgen. Nul staat
dan voor ‘is geen onderdeel van de klasse’ en één staat dan voor ‘is wel onderdeel van de klasse’.
In dat opzicht is de activatiefunctie f belangrijk. In deze thesis gebruiken we daarvoor telkens
de tanh-functie, mits deze overal voldoende glad is en mathematisch makkelijk te gebruiken is.
Figuur 2.2: De gladde tanh-functie als activatiefunctie
2.1 Het artificiële neuron en éénlagig netwerk
9
Met deze activatiefunctie is het nu makkelijk in te zien waarom een bias-invoer wordt gebruikt.
Om dit te illustreren gebruiken we een 1-dimensionele invoer. De activatie wordt dan h =
tanh(wx). Als we nu enkel de gewichten w kunnen aanpassen dan kunnen we de tanh-functie
niet horizontaal opschuiven, zie Figuur 2.3 links. Als we nu een biasterm toevoegen dan bekomen
we h = tanh(wx + wb ) waar wb voor het gewicht horende bij de bias-waarde staat. Dit zien we
rechts op Figuur 2.3. De bias kan dus de treshold verplaatsen.
Figuur 2.3: Links: Tanh-functies met verschillende gewichten. Rechts: Tanh-functies met verschillende biaswaarde.
Merken we nog op dat in ons MNIST voorbeeld er meerdere uitvoerkanalen nodig zijn. Het
geschreven cijfer kan 10 verschillende waarden aannemen en dus moeten er ook 10 uitvoerkanalen
zijn. Eén neuron zou dus nooit voldoende zijn geweest en een eenvoudig éénlagig netwerk biedt
hier dus een oplossing. Ondanks de eenvoudige structuur van dit netwerk, bestaan toch vele
toepassingen waarin het nut van dit neuraal netwerk bewezen kan worden. Een neuraal netwerk
is dan ook een universele approximator, d.w.z. dat indien er genoeg neuronen beschikbaar zijn,
het elke functie arbitrair dicht zal kunnen benaderen. Naast dit eenvoudige neurale netwerk
bestaan er andere architecturen die elk hun voordelen hebben. We denken bv aan de eerder
vermelde diepe neurale netwerken en de recurrente neurale netwerken. Aangezien we deze laatste
twee combineren en deze architectuur in deze thesis willen onderzoeken, zullen ze in wat volgt
uitgebreid aan bod komen.
2.2 Diepe neurale netwerken
2.2
10
Diepe neurale netwerken
Een diep neuraal netwerk (DNN) heeft in principe dezelfde werking als het één-lagig neuraal netwerk. Enkel zijn er nu meerdere lagen verborgen neuronen. Deze meerdere lagen zorgen ervoor
dat er complexere niet-lineaire relaties gemodeleerd kunnen worden. Diepe neurale netwerken
zorgen voor een betere prestatie in tal van gebieden waaronder beeldverwerking en classificatie, spraakherkenning en tijdssequenties [LeCun and Bengio, 1995]. Nemen we het voorbeeld
bijvoorbeeld van visuele taken om beter te duiden hoe dit komt. Iedere extra laag brengt een
verdere vorm van abstractie met zich mee. Zo zal een neuron in de eerste laag geactiveerd
worden door een punt, een neuron in een volgende laag door een verticaal streepje en in een
nog verdere laag door een lusje of een hoekje. Dit stemt overeen met de echte werking van de
hersenen ( [Chen, 1982]). Maw, de capaciteit om complexere zaken te modelleren wordt groter
en er ontstaat een hiërarchisch verband tussen de lagen.
Figuur 2.4: Schematische voorstelling van een diep neuraal netwerk
Ook wiskundig is er geen grote verandering als we gaan van een éénlagig netwerk naar een diep
neuraal netwerk. Ieder neuron heeft een activatie die functie is van alle inkomende signalen.
Deze kunnen dus ofwel uit de invoer komen, ofwel uit een voorgaande laag neuronen. Noemen
we de invoergewichtenmatrix tussen invoer en laag 1, V(0) en de gewichtenmatrix tussen laag i
2.3 Recurrente neurale netwerken
11
en i + 1 V(i) , dan hebben de neuronen in laag i de volgende activatie:
h(i+1) = f (V(i) h(i) )
(2.1)
Analoog is dan na de laatste laag N de uitvoer:
o = g(A h(N ) )
(2.2)
Ook de hiërarchische structuur is te zien in het wiskundige gedeelte. De lagen zijn telkens
afhankelijk van de vorige lagen en geven er zelf een nieuwe vorm aan. Op de training van dit
netwerk komen we later uitgebreid terug. De gewichtenmatrices spelen hierbij een grote rol.
Alvorens dat te doen behandelen we eerst de recurrente neurale netwerken.
2.3
Recurrente neurale netwerken
Om te kaderen waar het belang van recurrente neurale netwerken (RNN) net ligt, gaan we kijken naar hoe om te gaan met een discrete tijdsreeks. Stel dat we het volgende karakter in een
tekst willen voorspellen bijvoorbeeld, dan is een bepaalde context erg belangrijk. Als we gebruik
zouden maken van een diepe architectuur, dan moeten we als invoer een bepaald venster kiezen.
Dat venster bepaalt hoeveel van de vorige karakters we als invoer meegeven, zeg maar welke
context we meegeven aan het netwerk. De moeilijkheid ligt erin om te weten hoe lang de nodige
context moet zijn die wordt meegegeven aan het netwerk. Daarnaast is in een tijdsreeks vaak
een oorzaak-gevolg verband aanwezig. Ook daarvan maakt het DNN geen gebruik.
Recurrente neurale netwerken behandelen het voorgaande probleem op een andere manier. De
reden waarom een RNN context kan onthouden zit hem in zijn architectuur. Om deze uit te
leggen vertrekken we terug van een één-lagig standaard neuraal netwerk als op Figuur 2.1. Het
recurrente neurale netwerk heeft één zo’n netwerk per tijdsstap in de sequentiële reeks, echter
zijn de tussenliggende gewichten dezelfde voor ieder van die één-lagige netwerken. Met andere
woorden kopiëren we het ene één-lagig netwerk telkens opnieuw in de tijd. Om nu een context te
kunnen onthouden moeten deze subnetwerken met elkaar verbonden worden. Dit gebeurt door
de tussenliggende lagen neuronen te verbinden met elkaar zoals in Figuur 2.5. We noemen de
gewichten die met deze linken overeenstemmen de recurrente gewichten. Op die manier kunnen
de activatiewaarden van de neuronen uit een vorige tijdsstap dus meegenomen worden naar toekomstige tijdsstappen om zo een ‘geheugen’ in de tijd te creëeren. Om schematisch afbeeldingen
te vereenvoudigen in wat volgt, zullen we elke laag neuronen vervangen door één knooppunt in
2.3 Recurrente neurale netwerken
12
onze graaf als in Figuur 2.6. Een recurrent netwerk kan dan eenvoudiger voorgesteld worden als
Figuur 2.7.
Figuur 2.5: Een recurrent neuraal netwerk als verbonden één-lagige netwerken in de tijd
Figuur 2.6: Schematische vereenvoudiging van de grafische voorstelling RNN
Figuur 2.7: Vereenvoudigde voorstelling RNN
Om kort samen te vatten wordt dus één invoer per tijdsstap door een één-lagig netwerk gepropageerd. Er wordt een output (groen) gegenereerd en de activatiewaarden van de neuronen(zwart)
worden met de recurrente gewichten naar de volgende tijdsstap overgebracht. We gebruiken
de invoer- en uitvoergewichtenmatrices V en A uit de vorige paragrafen en voegen daar de
2.3 Recurrente neurale netwerken
13
recurrente gewichtenmatrix W aan toe. We krijgen dan in voorwaartse richting op tijdsstip t:
h(t) = tanh(V x(t) + W h(t−1) )
(2.3)
o(t) = tanh(A h(t) )
(2.4)
en
Op deze manier ontstaat dus ‘fading memory’ [Boyd and Chua, 1985], de activaties zijn afhankelijk van de invoer en de activaties uit de vorige tijdsstap. Die laatste zijn dan weer afhankelijk
van de tijdsstap ervoor enzovoort. Zo ontstaat mogelijks een oneindig lange context die steeds
kleiner wordt in de tijd. In tegenstelling dus met het DNN die enkel een venster kon bepalen
waarin context werd gebruikt. Naast tekstvoorspelling [Sutskever et al., 2011], zijn er tal van andere toepassingen zoals voorspelling van de beurs [Roman and Jameel, 1996], geautomatiseerde
controlesystemen [Ku and Lee, 1995] en vele andere..
2.4 Het backpropagation algoritme
2.4
2.4.1
14
Het backpropagation algoritme
Gradient descent
Om een neuraal netwerk te trainen (m.a.w. de prestatie van het netwerk te verbeteren), moeten
we dus de gewichten zodanig kunnen bekomen dat ze een zo goed mogelijke set uitvoeren geven
bij een gegeven set invoeren. Een zo goed mogelijke set uitvoeren is deze die het best overeenstemt met een meestal gegeven set targets. Hoe worden deze gewichten nu getraind? Om dat
te kunnen doen hebben we een kostfunctie nodig. De kostfunctie E is een maat voor hoeveel
de bekomen uitvoeren y afwijken van de vooropgestelde doelen (targets) t. Veelgebruikte kostfuncties zijn de kwadratische kostfunctie, de cross-entropy kostfunctie of de softmax kostfunctie.
Deze laatste wordt de softmax kostfunctie genoemd omdat de activatie van de output dan de
softmax-functie wordt:
yk =
exp(ak )
m
P
exp(ak )
k=1
Deze softmax wordt gebruikt bij een multiclass classificatie taak en geeft een kans terug dat de
input correspondeert met de klasse k. Het voordeel van de voorafgenoemde kostfuncties is dat
ze allen een gelijkaardige vorm aannemen als we gaan afleiden naar de activaties van een neuron.
We zullen later zien waarom dit zo belangrijk is.
1
E(y) = (y − t)2
2
m
1 X
[tk ln(yk ) + (1 − tk ) ln(1 − yk )]
E(y) =
m
kwadratische :
cross − entropy :
sof tmax :
(2.5)
(2.6)
k=1
E(y) =
m
X
k=1
tk ln(yk )
(2.7)
2.4 Het backpropagation algoritme
15
De kostfuncties zijn nu afhankelijk van de gewichten want de uitvoer van het netwerk y is
i . We krijgen dus E(y(W ). Om nu deze kostfunctie te minimaliseren met
afhankelijk van alle wjk
behulp van de gewichten is de volgende stap om de gewichten aan te passen in dalende richting
van E per iteratie t. Om dat te doen berekenen we de gradiënt van E ten opzichte van alle
gewichtsparameters. We gebruiken dan de volgende formule om de gewichten aan te passen:
W ← W − η ∇E(W )
(2.8)
Waarbij η de leersnelheid van het proces is. Dit proces heet gradient descent. De gradient van de
kostfunctie naar de gewichten wordt berekend. De gewichten worden in kleine stapjes aangepast
in deze richting (en dus in dalende richting van de kostfunctie) en het proces herhaalt zich tot
we in een minimum terechtkomen van de kostfunctie. Nu rest nog de vraag hoe we de gradient
berekenen. Dit is het eenvoudigst met het error backpropagation algoritme.
2.4.2
Error backpropagation
We starten met het bekijken van een eenvoudig netwerk waarbij de uitvoer yk een lineaire comP
binatie is van een invoer x zodat: yk =
wki xi . De kostfunctie E kunnen we schrijven als
i
P
: E = 21 (yk − tk )2 waarbij de tk de targets zijn. De afgeleide van de kostfunctie naar een
k
gewicht wji is nu:
∂E
∂wji
= (yj − tj )xi . Deze gradiënt kunnen we nu beschouwen als een product
van een fout (yj − tj ) aan de uitgaande kant van de relatie met de invoer van de relatie xi . In
het geval er een niet-lineaire activatiefunctie g wordt gebruikt aan de uitvoer moet volgens de
kettingregel enkel de afgeleide g 0 met de gradiënt vermenigvuldigd worden.
Als we nu gaan kijken naar een éénlagig netwerk zullen we hetzelfde patroon zien verschijnen
bij de berekening van de gradiënt van de kostfunctie E. In dit eenlagig netwerk zal de activatie
hj van het neuron j in de verborgen laag de volgende activatie van een gewogen som van de
invoeren x aannemen:
hj = f (
X
vji xi )
(2.9)
i
Daarna wordt een uitvoer gegenereerd:
yk = g(ajk hj )
(2.10)
Dit deel is de voorwaartse propagatie die we voordien al hadden besproken bij het eenvoudige
neuraal netwerk. Om dit netwerk te trainen moeten twee gewichtenmatrices aangepast worden.
2.4 Het backpropagation algoritme
16
De gewichtenmatrix A naar de uitvoer en de invoergewichtenmatrix V. De berekening van de
gradiënt naar de uitvoergewichtenmatrix A is compleet analoog als in het voorvermelde eenvoudige voorbeeldje. We vervangen enkel de invoeren uit het eenvoudige voorbeeldje door de
activatiewaarden h uit de tussenliggende laag neuronen. We krijgen dus:
∂En
= (ynj − tnj ) hni
∂aji
(2.11)
Voor de invoergewichtenmatrix V ligt het iets ingewikkelder. Bekijken we nu de afgeleide
van En naar een gewicht vji . De kettingregel geeft ons:
∂En
∂En ∂hj
=
∂vji
∂hj ∂vji
aangezien de uitvoer y berekend wordt als de gewogen som g(
(2.12)
P
A hj ). We gebruiken een
j
vereenvoudigde notatie: δj =
∂En
∂hj
en berekenen
∂hj
∂vji
= xi f 0 uit formule (2.9) om te bekomen:
∂En
= δ j xi f 0
∂vji
(2.13)
Formule (2.13) zegt ons dat de gevraagde afgeleide bekomen wordt door de fout δj in de uitgaande
kant van de relatie te vermenigvuldigen met de invoer van die relatie en wegens de kettingregel
ook nog te vermenigvuldigen met de afgeleide van de activatiefunctie, namelijk f 0 . Bemerk dat
dit dezelfde vorm heeft als de gradient naar de uitvoergewichten A. We moeten nu dus nog de
fout δj =
∂En
∂hj
berekenen. Opnieuw gebruik makend van de kettingregel krijgen we:
∂En X ∂En ∂yk
=
∂hj
∂yk ∂hj
(2.14)
k
De eerste term is dus de fout aan de uitvoer: (ynj − tnj ). De tweede term kan berekend worden
uit (2.10):
∂yk
∂hj
= akj g 0 . Merk op dat in deze terugpropagatie, de indices k en j voor de
uitvoergewichten omgedraaid zijn en we dus in matrixnotatie enkel de uitvoergewichtenmatrix
A moeten transponeren. Bovenstaande notatie’s zijn nogal omslachtig. Vandaar gaan we ze
even herhalen in matrixvorm.
We starten met de voorwaartse en al gekende propagatie. We berekenen de fout aan de uitvoer als
δuitvoer = Y −T Waarbij de matrix T staat voor alle targets. De fout kan dan teruggepropageerd
worden naar de verborgen neuronenlaag: δneuronenlaag = δuitvoer AT g 0 . Daarna kunnen op
gelijkaardige manier de gradiënten naar de matrices A en V worden berekend als:
∂E
= δuitvoer h g 0
∂A
∂E
= δneuronenlaag x f 0
∂V
(2.15)
(2.16)
2.4 Het backpropagation algoritme
2.4.3
17
Backpropagation bij Diepe Neurale Netwerken
We kunnen nu voorgaand algoritme makkelijk uitbreiden naar een meerlagige structuur. Dit is
makkelijk in te zien als we ons neuraal netwerk omzetten naar een graaf. De uitvoerlaag, iedere
tussenliggende neuronenlaag en de invoer zijn knooppunten in de graaf. Iedere gewichtenmatrix
daartussen is een pijl tussen 2 knooppunten. Om nodeloos ingewikkelde berekeningen te vermijden verwijzen we voor een volledige uitwerking van het backpropagation algoritme bijvoorbeeld
naar [Bishop et al., 2006] en gaan we schematisch de stappen (analoog aan het backpropagation
algoritme in een éénlagig neural netwerk) vermelden.
1. Propageer de invoer X voorwaarts doorheen het netwerk zoals we hebben gezien in sectie 2.2 om een uitvoer Y te bekomen.
2. Bereken de fout δuitvoer aan de uitvoer als Y − T .
3. Propageer de fouten achterwaarts doorheen het netwerk door ze te vermenigvuldigen met
de getransponeerde gewichtenmatrices van de relatie en de afgeleide van de gebruikte activatiefunctie. Tel fouten op indien ze van verschillende knooppunten naar één knooppunt gaan.
4. Zodra elk knooppunt geassocieerd is met een fout, bereken dan de gradiënten van de gewichtenmatrices door het product te nemen van de fout aan de uitgaande kant van de relatie en de
invoer van die relatie, opnieuw vermenigvuldigd met de afgeleide van de activatiefunctie.
5. Bereken de nieuwe gewichten met Formule (2.8).
6. Herhaal dit proces tot de optimale gewichtenmatrices zijn bereikt.
Dit is dus het backpropagation algoritme dat gebruikt kan worden in elk feed-forward netwerk en eenvoudig te implementeren is. Merk op dat als we nu één van de voorgaand vermelde
kostfuncties willen gebruiken, er geen aanpassing is aan het algoritme. De afgeleide
∂En
∂hk
zal im-
mers een gelijkaardige vorm blijven aannemen. Dit geeft als gevolg dat diepe neurale netwerken
kunnen gebruikt worden voor zowel regressie, binaire of multiclass classificatie problemen als
voor andere toepassingen. Het error backpropagation algoritme is dus een krachtige tool om
diepe neurale feed-forward netwerken te trainen en heeft op zichzelf een hele vooruitgang van
het onderzoeksgebied in de hand gewerkt.
2.4 Het backpropagation algoritme
2.4.4
18
Backpropagation Through Time
Het trainen van het RNN is grotendeels gelijkaardig aan het error backpropagation algoritme.
Dit aangepaste algoritme heet het ’backpropagation through time’ algoritme of kortweg BPTT
[Werbos, 1990]. Het maakt opnieuw gebruik van de recursieve formule die we gezien hebben
in het backpropagation algoritme. Het komt er op neer dat we het RNN ’ontplooien’ in de
tijd en gaan bekijken als een diep neuraal netwerk in de tijd. Voor de aanpassing van de
uitvoergewichten A kunnen we rechtstreeks de fout op de uitvoer berekenen en vermenigvuldigen
met de activatiewaarden van de neuronen. Er verandert dus niets om de gewichten A te trainen
in vergelijking met het gewone BP-algoritme. In het geval van de recurrente en invoergewichten
is dit anders... We beginnen met op de laatste tijdsstap de fout op de uitvoer te berekenen
en terug te propageren naar de laatste tussenliggende laag neuronen. Deze fout wordt dan
teruggepropageeerd naar de laag tussenliggende neuronen uit de vorige tijdsstap, waar ook de
fout van de uitvoer uit die tijdsstap terug wordt gepropageerd en erbij opgeteld alvorens een
volgende tijdsstap terug te keren. Schematisch ziet dat er uit als in Figuur 2.8.
Figuur 2.8: Schematische voorstelling BPTT. De blauwe cirkels zijn invoer, de zwarte tussenliggende neuronenlagen en de groene zijn de uitvoerlagen. Wanneer deze rood gekleurd worden,
zijn ze geassocieerd met een fout.
2.4 Het backpropagation algoritme
19
Slechts als de fout doorheen de hele sequentie is teruggepropageerd kunnen de gewichtenmatrices
V en W worden aangepast op dezelfde manier als in het BP-algoritme. De gradiënten worden
dan over alle tijdsstappen uitgemiddeld en daarmee worden dan de gewichtenmatrices aangepast.
Het gradient descent algoritme met BPTT dat gebruikt wordt bij de training van het RNN blijkt
niet altijd stabiel en onmiddellijk naar een oplossing te convergeren. Er zijn enkele bijkomende
problemen die het RNN met zich meebrengt. Eén daarvan zijn bifurcaties. Het kostlandschap
kan erg ruw zijn. Dit zorgt voor dit bijkomende probleem. Een bifurcatie kan herkend worden
aan een onstabiele fout en een plotse stijging ervan zoals in Figuur 2.9.
Figuur 2.9: fout tijdens het leerproces met een bifurcatie
De oorzaak hiervan is een erg grote gradiënt die de gewichtsaanpassing bepaalt. Door een discontinuı̈teit in de kostfunctie zal een kleine gewichtsaanpassing de kostfunctie erg sterk verhogen.
Deze verhoging zal dan bijgevolg ook de fout aan de uitvoer snel en sterk doen stijgen. Daardoor zal de nieuw berekende gradiënt dus veel hoger zijn dan in de vorige iteratie en de nieuwe
gewichten zullen een veel te grote stap nemen en terechtkomen in een gebied ver van de optimale
oplossing en dus in een onberekenbaar gebied. M.a.w. moet de training daar van nul opnieuw
beginnen.
Een heuristieke oplossing voor dit probleem bestaat erin de gradiënt voor de gewichtsaanpassing
te normaliseren. Dit zorgt ervoor dat deze laatste niet kan ontploffen en dat het leerproces
2.4 Het backpropagation algoritme
20
stabieler verloopt. Een uitgebreidere behandeling van de rol van bifurcaties in het trainen van
RNNs is te vinden in [Doya, 1993].
Figuur 2.10: stabilisatie fout na normalisatie gradiënt
Een ander bijkomend probleem bij de RNN heet het vanishing gradient probleem. Het komt
erop neer dat in bepaalde tijdsreeksen, een uitvoer sterk afhankelijk kan zijn van een invoer die
heel wat tijdsstappen terug ligt. Het is veelal zo dat wanneer een fout die terugpropageert in de
tijd, sterk daalt en uiteindelijk verdwijnt. Daardoor zal de gradiënt wanneer die berekend wordt
aan de tijdsstap van die vroegere invoer al te klein zijn om nog een efficiënte aanpassing in gewichten te kunnen bekomen. Oplossingen hiervoor zijn bijvoorbeeld Long-Short Term Memory
(geheugenblokken expliciet aanwezig in de architectuur) [Hochreiter and Schmidhuber, 1997] of
een uitgebreidere trainingsmethode zoals de Hessian free trainingsmethode [Martens, 2010].
Als illustratie van de werking van zo’n RNN bekijken we tekstvoorspelling. De te volbrengen taak bestaat erin om het volgend teken te voorspellen in een tekst, op die manier zelf een
stuk tekst te creëeren.
Om het netwerk te trainen gebruiken we het verhaal van roodkapje. Een invoer per tijdsstap
wordt dan één teken. Vertaald in een 29-dimensionale input (26 letters uit het alfabet + spatie,
punt en komma). Bij de letter A wordt dat dan bijvoorbeeld [1...0 0 0 ]T . De gewenste uitvoer
of targets per tijdsstap zijn dan van dezelfde 29-dimensionale vorm en zijn het volgende teken
in de sequentie. ‘De wolf ’ wordt zo opgesplitst in de tijd als de invoersequentie [D E ‘spatie’ W
O L F] en de bijbehorende targets zijn [E ‘spatie’ W O L F ‘spatie’].
2.5 Training
21
Figuur 2.11: Inputs en gewenste outputs bij roodkapje:illustratie
Met de 2898 tekens en dus 2898 tijdsstappen waaruit het sprookje bestaat wordt het netwerk
dan getraind zoals hiervoor beschreven met gradient descent en het BPTT. Gebruiken we dan
de getrainde gewichtenmatrices V ,W en A om tekst te voorspellen na een initialisatie: ‘de wolf
peuzelde roodkapje op. de jager (die ’ krijgen we bijvoorbeeld: ‘ snielons wolf. en
grote stenorman het ploemen was in het grotemen beslook vajl bestmenen op hij
maar erien en bijloi dal ni roodkapje was die bij de oma nakr waa’.
Met een heel simpel RNN met 50 neuronen zien we dat er al herkenbare woorden of woordgroepen worden geproduceerd. De initialisatie wordt gebruikt zodat een andere context wordt
meegegeven dan in het sprookje zelf voorkomt, om te voorkomen dat er letterlijke stukken tekst
uit het sprookje worden gekopieërd.
2.5
Training
Bij het gebruik van BP of BPTT duiken nog verschillende andere problemen op tijdens het trainen. We overlopen in wat volgt kort nog enkele van de belangrijkste waar in ieder trainingsproces
rekening mee moet gehouden worden.
2.5.1
Stochastic Gradient Descent
Bij het gebruik van gradient descent ontstaat een groot probleem wanneer de dataset te groot
wordt. Om de kostfunctie te berekenen voor alle datapunten loopt de computationele kost erg
sterk op. Het wordt ondoenbaar om met die hele dataset het gradient descent algoritme uit te
voeren. Om dit te verhelpen gaan we uit een reeks invoer een batch ‘knippen’. Die batch bestaat
uit een kleiner aantal elkaar opvolgende datapunten en we gaan daarmee het algoritme uitvoeren.
2.5 Training
22
Deze variatie van het gradient descent algoritme wordt stochastic gradient descent genoemd. Als
ervoor wordt gezorgd dat de batch toch voldoende relevante context met zich meedraagt (d.w.z.
groot genoeg is), zal het uiteindelijke model voor de taak dezelfde eigenschappen hebben in
vergelijk met het gewone gradient descent algoritme.
De batchgrootte wordt dus een hyperparameter van de training en er moet een afweging komen
tussen prestatie/precizie van het model en rekentijd afhankelijk van de batchgrootte. Om ervoor
te zorgen dat toch de hele dataset gebruikt wordt om te leren en dus om een optimaal model
te verkrijgen voor de uitgevoerde taak, gaan we per iteratie een andere batch willekeurig gaan
kiezen.
2.5.2
Validatieset
Hoe kunnen we nu de geschikte batchgrootte vinden bij een taak? We kunnen de prestatie
vergelijken na een training, maar het leerproces is erg afhankelijk van verschillende parameters.
Zowel de leersnelheid, het aantal iteraties als de initialisatie-gewichten hebben een grote invloed
op de uiteindelijke prestatie van het netwerk. Om deze hyperparameters te optimaliseren maken
we gebruik van een trainings- en validatieset. Om die te bekomen gaan we een deel van de
trainingsdata nemen om te valideren en dus niet om te leren. We laten het leerproces starten
en berekenen dan om de zoveel iteraties de prestatie op de validatieset. Door verschillende
parameterwaarden te gebruiken kunnen we de beste parameters vinden om dan het definitieve
leerproces te starten op de gehele trainingsdata (dus ook met validatieset.) Om dan uiteindelijk
met de beste parameters het netwerk te testen op de testset. Het gebruik van een validatie-set
voorkomt ook overfitting.
Overfitting is het fenomeen waarbij het netwerk de data zou ‘van buiten’ leren in plaats van een
onderliggend model te gaan zoeken (Dit laatste wordt generalisatie genoemd). Bij overfitting
zou het resultaat op de trainingsset erg goed zijn, maar dan zal bij de ongeziene validatieset de
prestatie veel kleiner zijn. Door het controleren met een validatieset gaan we dus zien wanneer
het netwerk start met overfitten en wanneer het leerproces beter gestopt kan worden. Een voorbeeld van het verloop van een trainings- en validatiefout zien we in Figuur 2.12. Als validatieset
gebruiken we in deze thesis 10% van de gegeven trainingsdata.
Door verschillende hyperparameters te sweepen, d.w.z. verschillende waarden gebruiken en
2.5 Training
23
diegene zoeken die de laagste validatiefout geven, gaan we het netwerk dus optimaliseren.
Figuur 2.12: Trainings-(onderste) en validatiefout (bovenste) van een overgefit netwerk
2.5.3
Initialisatie gewichten
Het leerproces start met de initialisatie van de gewichten. Er wordt in het algoritme echter niets
gezegd over waar het startpunt van de gewichten moet liggen. Hoe verder van het optimale
minimum van de kostfunctie er gestart wordt, hoe langer het leerproces zal duren en hoe meer
kans om vast te raken in een lokaal minimum onderweg.
Om de grootteorde van de initialisatiegewichten te kunnen beı̈nvloeden voeren we factor in.
Deze factor wordt dan elementsgewijs vermeningvuldigd met een matrix willekeurige getallen
uit een normaalverdeling met gemiddelde 0 en variantie 1.
Voor de recurrente gewichtenmatrix W is een vuistregel om de inverse van de vierkantswortel
van het aantal gebruikte neuronen per laag te nemen als factor. Deze keuze zorgt steeds voor
een goed resultaat. Voor de uitvoergewichts- en invoergewichtsfactor is het bepalen van een
optimale factor minder eenvoudig.
Om de invoergewichtsfactor te kiezen kijken we het best naar de activatiewaarden van de neuronen uit de eerste laag. Deze worden berekend als h1 = tanh( .. + V1 ∗ x). Als we nu naar
deze waarden gaan kijken, willen we voorkomen dat de tanh gesatureerd is geraakt, d.w.z. dat
alle waarden -1 of 1 zijn. Het liefst willen we dat de waarden vooral tussen -1 en 1 liggen en
normaler verdeeld zijn. Het opvolgen van een histogram zoals in Figuur 2.13 is dus een goeie
manier om de invoerfactor te bepalen. Er rest nog de uitvoerfactor te bepalen. In deze thesis
is over de uitvoerfactor gesweept, m.a.w. verschillende factoren zijn gebruikt en diegene die het
2.5 Training
24
beste resultaat geeft op de validatieset (zie vorige sectie), werd gekozen.
Figuur 2.13: Voorbeeld histogram van activatiewaarden eerste laag neuronen. We zien dat de
activatiewaarden goed verdeeld zijn tussen -1 en 1.
2.5.4
Leersnelheid + aantal iteraties
Bij iedere aanpassing van de gewichten wordt de gradiënt vermenigvuldigd met de leersnelheid η
(zie Formule 2.8). Een andere leersnelheid zal de grootte van de stapjes in het gradient descent
algoritme veranderen en kan ook de prestatie van het neuraal netwerk veranderen. Daarom is
het nodig ook over deze parameter te sweepen. Naast een constante leersnelheid, kan men er
ook voor kiezen om deze te laten afnemen per iteratie. Op die manier worden steeds kleinere
stapjes richting het optimale minimum gezet en kan het dus preciezer benaderd worden.
De leersnelheid η kunnen we op twee manieren laten afnemen: lineair en exponentieel. Door
telkens te vermenigvuldigen met een factor of met een contant getal af te trekken. In ons geval
hebben we gekozen om lineair te laten dalen naar 0 als:
η0 = η −
η
aantal iteraties
(2.17)
Het aantal iteraties is belangrijk om overfitting te voorkomen zoals hiervoor uitgelegd. Een goeie
combinatie van leersnelheid en aantal iteraties wordt dus gekozen aan de hand van de geleverde
prestatie op de validatieset.
2.6 Samengevat
2.6
25
Samengevat
Neurale netwerken en uitbreidingen als diepe neurale netwerken en recurrente neurale netwerken
zijn krachtige concepten om taken op te lossen die expliciet moeilijk te programmeren zijn en die
lijken buiten de beschouwing van computerprogramma’s te vallen. De verschillende types hebben
elk hun eigen voordelen. Diepe neurale netwerken hebben een hoger vermogen complexere data
te ontleden en gebruiken. Recurrente netwerken tenslotte hebben dan weer het vermogen om
een ‘oneindinge’ context te onthouden en blinken uit in sequentiële data. Daarnaast zijn ze ook
relatief eenvoudig te trainen met gradient descent en het backpropagation algoritme waardoor
hun gebruik enkel maar bevorderd kan worden. Naast de gebruikte algoritme’s moet nog rekening
gehouden worden met tal van andere problemen tijdens de training.
DIEPE RECURRENTE NEURALE NETWERKEN
26
Hoofdstuk 3
Diepe Recurrente neurale netwerken
Een recente architectuur, een diep recurrent neuraal netwerk, probeert de voordelen van een
diepe architectuur te combineren met die van een recurrent neuraal netwerk. De reden waarom
we dit willen onderzoeken, is om tegemoet te komen aan de tekortkomingen die een recurrent
netwerk met zich meebrengt. We zullen deze eerst kort bespreken waarna we in meer detail de
diepe recurrente neurale netwerken (DRNN’s) zullen bespreken en kort enkele recente artikelen
zullen bespreken die over deze DRNN’s gepubliceerd zijn geweest.
3.1
Tekortkomingen recurrente neurale netwerken
De recurrente netwerken besproking in vorig hoofdstuk hebben een grote vooruitgang geboekt
in hun gebied. Prestaties op taken werden verbeterd en bijhorende trainingsalgoritme’s werden
bedacht. Toch hebben ze nog enkele tekortkomingen. In de eerste plaats schuilt er achter
bepaalde invoer een hoge complexiteit. Aangezien een recurrent netwerk binnen één tijdsstap
slechts door één neuronenlaag gaat, mist het RNN het vermogen om de complexiteit van die
data te verwerken. Vandaar dat we een grotere diepgang in het netwerk willen krijgen. Die
zou volgens ons een oplossing bieden voor bovenstaand probleem. Daarnaast is het ook zo dat
data een hiërarchisch verband kan hebben op verschillende tijdsschalen. Met deze assumptie
wordt niet expliciet rekening gehouden in de architectuur van het RNN. Naar analogie met de
uitbreiding van een eenvoudig neuraal netwerk naar een diep netwerk willen we rekening houden
met de hiërarchiën in de tijd.
3.2 Concept en doel DRNN
3.2
27
Concept en doel DRNN
Om nu de diepgang in de recurrente neurale netwerken te verkrijgen, gaan we verschillende
recurrente neuronenlagen uit het normale RNN op elkaar stapelen. De activatie van de ene
recurrente laag is dan de invoer voor de volgende. Zo verkrijgen we een diepte in zowel tijd (door
de recurrente gewichten) als in ruimte (door de verschillende lagen op elkaar te stapelen). Zo zijn
er verschillende niet-lineariteiten voor de invoer de uitvoer bereikt en bestaat de mogelijkheid
dus dat complexere verbanden gemodelleerd worden. Op Figuur 3.1 zien we hoe dit schematisch
in elkaar zit.
Figuur 3.1: Een drie-lagig diep recurrent neuraal netwerk
In deze thesis gaan we uitgebreid onderzoeken welke toegevoegde waarde de extra lagen met
zich meebrengen. Zowel qua prestatie als qua context. De bedoeling is om aan te tonen dat
een extra laag zou instaan voor een langere meegenomen voorgeschiedenis. Op die manier zou
dus een betere modellering kunnen ontstaan voor bepaalde taken. Voor we de gedetailleerde
werking van deze DRNN’s in detail gaan bespreken, bekijken we enkele recente artikelen die ook
een uitbreiding van het RNN beschouwen.
3.3
Literatuur DRNN
Het fading gradient probleem van een RNN met een enkelvoudige recurrente neuronenlaag bespraken we eerder. Een voorgestelde oplossing voor dit probleem heet LSTM of long-short term
memory [Hochreiter and Schmidhuber, 1997]. Dit speciale type neuraal netwerk maakt gebruik
3.3 Literatuur DRNN
28
van geheugenblokken om vele tijdsstappen terug te kunnen gaan kijken. Het netwerk leert dan
zelf hoe het die geheugenblokken gebruikt maar ze zorgen voor een rechtsstreekse verbinding in
plaats van de context door iedere recurrente stap mee te nemen. Deze blokken zijn expliciet in
de architectuur aanwezig.
[Graves et al., 2013] combineert in zijn artikel deze LSTM-blokken met een meerlagig recurrent
netwerk en verschillende trainingsmanieren. De nadruk in dit artikel ligt vooral in de prestatie op de spraakherkenningsdataset TIMIT en niet in de precieze functionaliteit of analyse
van hun resultaten. Diezelfde [Graves, 2013] heeft dan dezelfde architectuur gebruikt om handschrift te voorspellen en uiteindelijk te genereren. Ook op tekstvoorspelling aan de hand van
een wikipedia-dataset heeft hij de structuur getest. De resultaten werden zeer positief bevonden
en het netwerk kon zelfs handschriften leesbaarder maken met de juiste instellingen. Opnieuw
lag de focus op prestatie.
[Pascanu et al., 2013] bekeek het probleem dan weer iets theoretischer. Er werden verschillende
manieren voorgesteld om een RNN dieper te maken. Het voorvermelde DRNN die in deze thesis
wordt onderzocht is er daar één van. Daarnaast stelt hij ook voor om tussen de recurrente
neuronenlagen in de tijd een extra diepte te creëeren. Beide architecturen werden getest op muziekvoorspelling en taalmodellering en bereikten state-of-the-art resultaten. Het dieper maken
van een RNN heeft dus al verschillende veelbelovende resultaten geboekt.
In [Hermans and Schrauwen, 2013] wordt het DRNN gebruikt die ook in deze thesis onderzocht
wordt. Na de introductie ervan, wordt ze toegepast op tekstvoorspelling op een wikipediadataset. Met een simpele trainingsmanier worden toch betere resultaten geboekt dan met een
ingewikkeld RNN, namelijk het MRNN [Sutskever et al., 2011]. Dit laatste werd getraind met
een geavanceerdere trainingstechniek: Hessian-Free training [Martens, 2010]. Daarnaast wordt
ook een analyse van de resultaten en het nut van de extra lagen gemaakt. Het lijkt zo te zijn dat
de hoogste laag van het DRNN instaat voor de abstractere concepten en lagere lagen voor de
minder abstracte. Ook op lange termijn boekt het DRNN goeie resultaten. Zo wordt er gekeken
naar het openen en sluiten van haakjes. Terwijl er een lange woordreeks tussen het openen en
sluiten van haakjes kan staan, slaagt het netwerk er toch in om daar rekening mee te houden.
Dit blijkt vooral door de hoogste laag te zijn. Daaruit kunnen we besluiten dat extra lagen,
extra tijdsschalen kunnen modelleren.
Deze thesis gaat dus verder op het werk van [Hermans and Schrauwen, 2013]. We gebruiken het
DRNN zonder LSTM-blokken en gaan deze testen op de TIMIT-spraakherkenningsdataset en
3.4 Werking DRNN
29
op het modelleren van symbolische muziek in de twee volgende hoofdstukken. Hierbij focussen
we niet enkel op prestatie maar ook op de analyse van de functionaliteit van de lagen.
3.4
Werking DRNN
Het voorwaarts propageren om een uitvoer per tijdsstap te genereren verschilt niet veel van het
gewone RNN. Voor de duidelijkheid gaan we dit toch even kort overlopen. Gaan we eerst even
inzoomen op één tijdsstap dan zien we schematisch hoe dit in elkaar zit in Figuur 3.2.
Figuur 3.2: Een tijdsstap uit een drie-lagig DRNN
Iedere pijl staat voor een gewichtenmatrix zoals voorheen. Merk op dat ook in iedere tussenliggende neuronenlaag een pijl zou moeten toekomen. Omdat de gewichtenmatrices per tijdsstap
dezelfde zijn, is ervoor geopteerd deze pijlen niet nog eens bij te tekenen. Aangezien er meerdere
tussenliggende lagen zijn moeten we nu ook extra gewichtenmatrices invoeren. Als conventie
nemen we Vi voor een relatie tussen input en tussenliggende laag of tussen een tussenliggende
laag naar een hogere tussenliggende laag. Van een tussenliggende laag naar een output gebruiken
we Ai en voor de recurrente gewichten nemen we Wi met i van één tot en met het aantal lagen
dat gebruikt werd. Deze conventie staat geı̈llustreerd op Figuur 3.3.
Het voorwaarts propageren is analoog als in het diepe of in het recurrente neurale netwerk. Bij
(t+1)
de activatie-waarden van de neuronen hebben we nu hj
(t)
(t+1)
= f (Wj hj + Vj h(j−1) ). h0 wordt
P
(t)
hier dan gelijkgesteld aan de invoer x. De uitvoeren hebben de vorm: y (t) = g( Aj hj ). Als
j
activatiefunctie f in de neuronen werd telkens de tanh-functie gebruikt. De uitvoer-functie g is
afhankelijk van de toepassing. Staan we nog even stil dat iedere laag een verbinding heeft met
3.4 Werking DRNN
30
Figuur 3.3: Een drie-lagig DRNN met bijhorende gewichtenmatrices
de uitvoer in plaats van enkel de bovenste. Deze keuze is gemaakt om het vanishing-gradient
probleem te voorkomen. Iedere laag dat de gradiënt doorloopt wordt hij kleiner. De onderste
lagen zouden dus in dat geval erg klein kunnen worden en de lagen zouden ineffectief getraind
worden. Door een verbinding te maken tussen iedere laag en uitvoer wordt dit dus verholpen.
Het is ook makkelijker om de functionaliteit van een laag te bekijken. Maar daar komen we
later op terug.
Het trainen van het netwerk kan nog steeds met BPTT. In een neuronenlaag komt een fout toe
vanuit de corresponderende neuronenlaag één tijdsstap verder. Daar komt ze samen met een
fout die rechtstreeks van de uitvoer komt. En dan moet ze opnieuw doorheen de hele laag terug
worden gepropageerd om dan hetzelfde proces te herhalen in de laag daaronder en zo verder.
Het gradient descent algoritme is dus nog steeds eenvoudig uit te voeren en wordt in volgende
hoofdstukken dus ook gebruikt bij de training.
TOEPASSING 1: TIMIT
31
Hoofdstuk 4
Toepassing 1: TIMIT
Onze eerste toepassing voor de DRNN’s is spraakherkenning. We maken gebruik van de TIMITdatabase [Garofolo et al., 1993]. Deze bestaat uit ingelezen tekst door 462 engelstalige sprekers
met verschillende dialecten. De audio-signalen worden verwerkt in 39 dimensionale vectoren
om classificatie van fonemen mogelijk te maken. Elk van deze vectoren zijn manueel gelabeld
als een foneem. Ieder sample is dus een 39-dimensionele inputvector corresponderend met een
foneem. De database bestaat uit 1 010 659 trainingssamples en 350 343 testsamples. De stateof-the-art classificatiefout ligt onder de 20% PER of phoneme error rate [Graves et al., 2013].
Deze foutmaat is een andere dan de simpele fout die wij in wat volgt zullen gebruiken. Het is
echter niet de bedoeling in deze thesis om dat te evenaren, maar om te onderzoeken of een diep
recurrent neuraal beter scoort dan een één-lagig recurrent neuraal netwerk.
4.1
training
Zoals in hoofdstuk 2 en 3 besproken gebruiken we het simpele stochastic gradient descent algoritme in combinatie met backpropagation through time bij de training. Om het netwerk te
trainen moeten zoals in vorige hoofdstukken vermeld een aantal metaparameters gesweept worden. We maken dus gebruik van een validatieset om de beste parameters te vinden. Die worden
dan gekozen en daarna trainen we het netwerk opnieuw met de trainings- en validatieset samen
om dan de prestatie op de testset te bekijken. Als validatieset gebruiken we ongeveer 10 % van
de gegeven trainingdata. Aangezien we bezig zijn met een multi-class classificatietaak gebruiken
we als uitvoerfunctie g de softmax. Deze geeft een probabiliteit terug dat het te schatten foneem
tot de k-de klasse behoort en dit voor elke klasse.
4.2 Resultaten
4.2
32
Resultaten
4.2.1
Hoe vergelijken?
Eén van de doelen van deze thesis, bestaat erin een DRNN met verschillende lagen te vergelijken
met een RNN met één laag. Aangezien beide configuraties niet van hetzelfde aantal gewichtenmatrices gebruik maken moet er dus een eerlijke manier gevonden om onderling de prestaties
te vergelijken. Aangezien het aantal coëfficiënten van de gewichtenmatrices afhangt van het
aantal gebruikte neuronen per laag, zullen we deze zo aanpassen dat het totaal aantal gebruikte
parameters (gewichtscoëfficiënten in alle gewichtenmatrices) gelijk is. Voor iedere invoermatrix
Vi met i 6= 1 hebben we N × (N + 1), voor V1 hebben we N × d met d de dimensie van de invoer,
voor Ai hebben we d × N en voor Wi hebben we N × N . Na optellen bekomen we voor het
aantal parameters p in functie van het aantal neuronen per laag N en het aantal lagen L dat
het DRNN bezit:
p = N d + (L − 1) N (N + 1) + L N 2 + L (N d)
(4.1)
= (2L − 1) N 2 + N [(d + 1) L + (d − 1)]
(4.2)
' (2L − 1) N 2 + d (L + 1) N
(4.3)
Deze tweede-graadsvergelijking in N kan dan gebruikt worden om, gegeven het totaal aantal
parameters dat gebruikt kan worden, het juiste aantal neuronen per laag te berekenen. Bij de
TIMIT-taak hebben we gebruik gemaakt van 400 000 parameters. Voor een DRNN van 1 tot
en met 5 lagen geeft dit dan het aantal neuronen per laag in onderstaande tabel:
Aantal lagen L
Aantal neuronen N
1
600
2
3
4
5
348
269
227
200
Eens we het aantal neuronen per laag weten, gaan we nu de metaparameters sweepen. Het
is belangrijk dat we bij ieder netwerk (dus de DRNN’s met verschillend aantal lagen) dezelfde parameters gebruiken. Daarom gaan we het gemiddelde van de validatiefouten gebruiken als maat voor de prestatie van de metaparameters. Als batchgrootte hebben we een invoer van 50 tijdsstappen gekozen. Daarna is een invoerfactor gekozen van 0.005 a.d.h.v. het
histogram van de activaties in de eerste laag. De uitvoerfactor kiezen we nul. De leersnel-
4.2 Resultaten
33
heid en het aantal iteraties zijn gesweept.
− 38
[10−3 ,10
− 37
,10
− 53
,10−2 ,10
− 34
,10
,10−1 ,10
− 32
We hebben de leersnelheid η laten variëren in
1
,10− 3 ,1]. De beste validatiefouten werden bekomen
bij η = 0.1. Aangezien we η lineair laten dalen over het aantal iteraties is ook deze parameter
niet vrij te kiezen. Na sweepen kiezen we 1.5M iteraties.
4.2.2
Vergelijken prestatie
Na het trainen willen we in eerste instantie weten hoe de prestatie zich verhoudt tot het aantal
lagen er gebruikt worden in het DRNN. Als prestatie hebben we het volgende foutpercentage:
De verhouding van het aantal misgeclassificeerde fonemen op het totaal aantal geclassificeerde
fonemen.
Net zoals bij het trainen laten we door het getrainde netwerk een uitvoer genereren aan de hand
van de invoer van de testset. Dit geeft dan opnieuw een kansverdeling over de verschillende
fonemen. Het foneem met de hoogste kans wordt gekozen en vergeleken met het targetfoneem
van de testset. Herhalen we dit proces voor alle test-invoeren dan bekomen we het testfoutenpercentage.
De resultaten voor een DRNN van 1 t.e.m. 5 lagen is te zien op Figuur 4.1.
Figuur 4.1: Testfout in functie van het aantal lagen L
We zien dat de trend die we hoopten te bekomen zichtbaar is. Bij een éénlagig RNN hebben
we een testfout van 0,2856. De fout daalt per extra laag tot een fout van 0,2753 in een vijflagig
DRNN wat een verbetering geeft van 0,0103. Deze verbetering is zichtbaar maar relatief klein.
Hieronder een overzicht van de fout per aantal lagen:
4.2 Resultaten
Aantal lagen L
Testfout
34
1
0.2856
2
3
4
5
0.2817
0.2789
0.2764
0.2753
Het eerste deel van het doel van de thesis kan dus bij deze toepassing positief geëvauleerd worden.
Rest nog de vraag wat verantwoordelijk is voor deze verbetering in prestatie en of er een verband
is met de context die per laag belangrijk is.
4.2.3
Context
Om een schatting te maken welke context onze DRNNs met zich meedragen, gaan we opnieuw
gebruik maken van het backpropagation-algoritme. Deze keer echter, gaan we niet de gewichten
trainen, maar de invoer. We starten met een willeukeurige invoer, propageren een aangepaste
fout doorheen het al getrainde netwerk en passen de invoer aan, net zoals we deden bij de gewichtenmatrices. Zo bekomen we een ‘gewenste’ invoer door het netwerk. De aangepaste fout
wordt zo ontworpen dat enkel het targetfoneem in één tijdsstap belangrijk is, wat ervoor gegeven
wordt als uitvoer is niet belangrijk en de fout in iedere vorige tijdsstap wordt dus op 0 gebracht
en niet teruggepropageerd. Toch zal de gewenste invoer ook vroeger in de tijd aangepast worden
door de terugpropagatie doorheen de tijd, zie Figuur 4.2. Door deze gewenste invoeren uit te
middelen over verschillende targetfonemen kunnen we dan een schatting van de context bekomen.
Deze schatting kan ons dan een idee geven van de context die het netwerk gebruikt, door te
kijken naar hoe ver in de tijd er nog een relatief belangrijke invoer is. Gebruik makend van ridge
regression zal ver in het verleden de gewenste invoer naar 0 convergeren. Ridge regression zorgt
ervoor dat we bij iedere aanpassing van de te trainen invoer we een deel van de huidige invoer
gaan aftrekken. In formule wordt dit:
invoer’ = invoer − η gradient − λ invoer
(4.4)
waarbij λ de regressieparameter is. Deze bepaalt hoe sterk we de gewenste invoer willen onderdrukken. Als we geen gebruik zouden maken van ridge regression zou de geı̈nitialiseerde invoer
in het verleden waar ze niet belangrijk is, hoog blijven en dus een slechte schatting geven van
de context.
4.2 Resultaten
35
Figuur 4.2: Het trainen van de ‘gewenste’ invoer verloopt in drie stappen: 1) De fout wordt
enkel in de huidige tijdsstap (cirkel rechts) naar de laag in kwestie teruggepropageerd, hier is
dat de tweede laag. Ze wordt dan doorheen die hele laag teruggepropageerd (boven). 2) De
fout wordt doorheen het hele netwerk naar de invoer gepropageerd (onder). 3) De invoer wordt
aangepast en dit proces herhaalt zich.
We willen nu, in plaats van de context-afhankelijkheid van heel het netwerk, laag per laag gaan
schatten of elke toegevoegde laag ook een toegevoegde context heeft. In analogie met de hogere
complexiteit per laag van een Diep Neuraal Netwerk. Om per laag te kunnen de gewenste invoer
trainen, gaan we enkel de aangepaste fout terugpropageren naar de laag in kwestie. En niet
naar alle lagen zoals wel werd gedaan in het gewone trainingsproces. Het trainingsproces werd
gedaan met 1000 iteraties en een leersnelheid van 0.1. Het resultaat voor iedere laag is mooi
samengevat in onderstaande figuur. We geven de genormeerde grootte’s weer van de gewenste
invoer gesommeerd over alle invoerkanalen. Met andere woorden hebben we de gewenste invoer
van elke laag gedeeld door de maximale waarde over alle tijdsstappen in de gewenste invoer van
4.2 Resultaten
36
die laag om beter te kunnen vergelijken tussen de verschillende lagen.
Figuur 4.3: Schatting context voor de verschillende lagen: We zien een steeds grotere context
(grotere relatieve waarden in vroegere tijdsstappen per laag)
We zien mooi dat voor elke laag, de temporele context langer is. Bij de eerste laag wordt er
slechts tot ongeveer 15 tijdsstappen teruggekeken om een schatting te maken van de uitvoer. Bij
de vijfde laag wordt er al tot ongeveer 30 stappen teruggekeken in de tijd om diezelfde schatting
te maken. We zien dus duidelijk dat een hogere laag, een langere context draagt. Vanzelfsprekend is het zo dat de eerste tijdsstappen terug in de tijd het belangrijkste zijn. Vandaar de
hogere waarden.
Merk op dat we voor de regressieparameter met verschillende waarden hebben gewerkt (0.01
0.1 1 10) om te controleren dat de waarneembare trend geen gevolg is van louter ridge regression. Als we enkel met één regressieparameter zouden trainen, zou mogelijks de te observeren
trend geforceerd zijn door ridge regression. De trend werd bij elke waarde van λ opnieuw gezien
en dus is het voorgaande niet het geval. bovenstaande figuur is één voorbeeld met λ=10.
4.2 Resultaten
37
Om de gewenste invoer op een andere manier te trainen hebben we ook nog een variatie van het
vorige algoritme gebruikt. Bij het vorige trainingsalgoritme werd in de voorwaartse propagatie
niets veranderd in vergelijking met de normale training van de gewichtenmatrices van een DRNN.
We kunnen nu ook, om nog specifieker de functionaliteit van een enkele laag te gaan bekijken, ervoor zorgen dat enkel de laag in kwestie een verbinding met de uitvoer heeft. En dus
wordt de uitvoer enkel berekend vanuit die laag als y = g(Alaaginkwestie hlaaginkwestie ) en is ze niet
meer afhankelijk van de andere lagen. De andere lagen hebben dus geen rechtstreekse bijdrage
meer en kunnen het resultaat van de gewenste invoer niet beı̈nvloeden. In het terugpropageren
verandert er niets aangezien we al enkel terugpropageerden naar de laag in kwestie.
De resultaten bij deze variatie zijn gelijkaardig. Dezelfde trend werd gezien en ook hier is de
temporale context groter bij een hogere laag:
Figuur 4.4: Schatting context voor de verschillende lagen op de tweede manier: Dezelfde trend
is te observeren als hiervoor)
4.2 Resultaten
4.2.4
38
Vergelijken invoer
Als laatste test kunnen we nu nog de gewenste invoer bekomen uit vorige paragraaf gaan vergelijken laag per laag en met een echte invoer uit de dataset bij het gegeven target. In onderstaande
figuren zien we telkens dat de gewenste invoer voor iedere laag sterk verschilt met de echte invoer.
Toch, kunnen we per stijgende laag telkens zien dat de gewenste invoer verder in het verleden
teruggaat en dus de temporale context groter wordt. De bovenste figuur heeft targetfoneem 24
en werd getraind met λ=1. De middenste figuur heeft targetfoneem 17 en werd getraind met
λ=0.1. En de laatste figuur heeft targetfoneem 6 en is getraind met λ = 0.03.
Figuur 4.5: Targetfoneem 21. Van linksboven naar rechtsonder: Echte invoer, Gewenste invoer
laag 1 t.e.m. 5
4.2 Resultaten
39
Figuur 4.6: Targetfoneem 18. Van linksboven naar rechtsonder: Echte invoer, Gewenste invoer
laag 1 t.e.m. 5
Figuur 4.7: Targetfoneem 8. Van linksboven naar rechtsonder: Echte invoer, Gewenste invoer
laag 1 t.e.m. 5
4.3 Samengevat
4.3
40
Samengevat
De TIMIT-toepassing toont heel mooi aan wat nu net het voordeel is van de DRNN-architectuur.
De extra lagen zorgen voor een betere prestatie met eenzelfde aantal toegelaten parameters. Dit
kan worden uitgelegd door te kijken naar de gebruikte context. Iedere toegevoegde laag gaat
rekening houden met fonemen uit een verder verleden. Zo kan een betere schatting worden
gemaakt over welk foneem op de huidige tijdsstap gezocht wordt en dit vertaalt zich in de
verbetering van de prestatie.
TOEPASSING 2: SYMBOLISCHE MUZIEK
41
Hoofdstuk 5
Toepassing 2: Symbolische muziek
5.1
introductie
Na de TIMIT-toepassing, is er als tweede toepassing symbolische muziek gekozen. Een DRNN
immers is uitermate geschikt om een hiërarchie in de tijd te modelleren. Het ritme van muziek
zou daar dus perfect bij moeten aansluiten. Na een korte literatuurstudie werd gevonden dat
het aanleren van jazz-ritmes mogelijk is a.d.h.v. LSTM of long short term memory [Franklin,
2005] [Eck and Schmidhuber, 2002]. Dit is een speciaal type recurrent neuraal netwerk dat
gebruik maakt van geheugenblokken om vele tijdsstappen terug te kunnen gaan kijken. Deze
blokken zijn expliciet aanwezig in de architectuur terwijl het ons doel is om zo’n functionaliteit
impliciet in de DRNN-architectuur te verkrijgen.
Het doel bij deze toepassing is dus een model van de muziek te maken en dan zo uiteindelijk ritme’s te leren of genereren. Om de moeilijkheid van de taak enigzins te beperken, is er
gekozen om enkel te werken met klassieke pianomuziek. De zelfgemaakte dataset bestaat uit 106
muziekstukken in MIDI-formaat. Bij het MIDI-formaat, dat veel wordt gebruikt bij keyboards,
wordt opgeslaan wanneer een noot ‘ingedrukt’ is en wanneer ze weer losgelaten wordt. Om
nu deze MIDI-bestanden te verwerken naar een ideale invoer, is er een raster gemaakt met 25
punten per seconde voor iedere noot. Een rasterpunt staat aan als de noot speelt; het staat af
als de noot niet aan het spelen is. Voor alle 127 noten in het MIDI-spectrum ontstaat dus een
invoervector met dimensionaliteit 25 keer het aantal seconden. Kortweg wordt er dus om de
0.04 seconden gekeken welke noten aanliggen op dat moment. Diegene die aanliggen krijgen een
1 op die tijdsstap, de andere krijgen een 0 en dan wordt overgegaan op de volgende tijdsstap.
5.1 introductie
42
De grootte van de sample rate, m.a.w. het aantal rasterpunten per seconde, is een belangrijke
afweging tussen het verliezen van informatie en de moeilijkheid voor het netwerk om een ritme
te leren. Een noot die twee maal kort na elkaar gespeeld zou worden, zou met een te kleine
samplerate als één noot geı̈nterpreteerd worden, zie Figuur 5.1. Daar staat tegenover dat hoe
meer tijdsstappen een DRNN in het verleden context nodig heeft, hoe moeilijker het wordt deze
nog mee te dragen (door onder andere het vanishing gradient probleem) en dus hoe moeilijk het
zal worden om een ritme aan te leren.
Figuur 5.1: Raster voor verschillende samplerates
Het trainingsalgoritme vertoont kleine aanpassingen t.o.v. de TIMIT-toepassing. Daar verschillende noten tergelijkertijd kunnen gespeeld worden, kunnen we dus geen gebruik meer maken
van de softmax uitvoerfunctie. Deze waarborgt immers één gespeelde noot in plaats van verschillende noten tergelijkertijd. Om dit probleem op te lossen gaan we voor ieder kanaal apart,
dus voor iedere noot, een sigmoidfunctie als uitvoer gebruiken. Deze zal dan ook per kanaal (en
niet meer gezamenlijk zoals bij de softmax) een probabiliteit als uitvoer geven of de noot al dan
niet gespeeld wordt. Deze aanpassing van de softmax-functie in de sigmoidfunctie verandert
niets aan het backpropagation trainingsproces.
Om dezelfde reden als hiervoor, namelijk dat er meerdere noten tergelijk kunnen gespeeld worden, zal ook de kostfunctie en de fout anders gedefinieerd worden. We gebruiken nu de crossentropy kostfunctie en fout. Met t de targets en p de probabiliteiten gegeven als uitvoer wordt
deze gedefinieerd als:
cross-entropy error = −
N
X
i=1
[ti log pi + (1 − ti ) log(1 − pi )]
(5.1)
Deze cross-entropy fout zal gebruikt worden om de prestatie van het netwerk te kunnen beoor-
5.2 Prestatie
43
delen. Het geeft een maat voor de overlap tussen de berekende probabiliteiten door het netwerk
en de targets. De targets in het geval van een voorspellend netwerk zijn de invoeren van de
volgende stap, net zoals bij de roodkapje taak.
5.2
Prestatie
Na dezelfde stappen te doorlopen als bij de TIMIT-toepassing (sweepen hyperparamaters met
validatieset, netwerk trainen en testen op testset) bekomen we de prestatie voor de muziektoepassing. Als validatieset hebben we hier de middenste 10% gekozen van de data. Als leersnelheid
η hebben we 0.5 met 20000 iteraties. Opnieuw daalt de leersnelheid lineair naar nul. Als invoerschaling gebruiken we 0.1 en in tegenstelling tot de TIMIT-taak hebben we hier wel een
uitvoerschaling gebruikt. Als we alle uitvoergewichten op nul zetten om te initialiseren merken
we dat de uitvoeren allen identiek blijven en dus geen ritme wordt geleerd. Vandaar is de uitvoerschaling 2 gekozen om te starten met een variatie in de uitvoeren. Om een ritme te kunnen
leren is er gekozen voor een grote batchgrootte van 500 ofwel 20 seconden aan een samplerate
van 25. Bij deze toepassing maken we gebruik van een netwerk van 166 200 parameters. Dit
komt overeen met het volgende aantal neuronen per laag voor ieder DRNN:
Aantal lagen L
Aantal neuronen N
1
300
2
3
4
5
180
138
115
100
Op Figuur 5.2 zien we dat er een nog relatief grote verbetering is door het toevoegen van lagen.
De prestatie verbetert met 0.0155. De fout per laag wordt gegeven in onderstaande tabel:
Aantal lagen L
Cross-entropy fout
1
0.0390
2
3
4
5
0.0265
0.0249
0.0243
0.0235
Om te onderzoeken hoe dit komt, gaan we opnieuw een gewenste invoer laten trainen door
het netwerk. Net als bij TIMIT slaan we de gewichtenmatrices op na de training van het vijflaagse DRNN en gebruiken we die om de invoer te gaan trainen. De leersnelheid hier werd
groter gekozen, namelijk 10. De regressieparameter is echter kleiner, namelijk 10−4 . Na 1000
iteraties en uitmiddelen over verschillende targetnoten, bekomen we dan zo Figuur 5.3. Deze is
genormeerd zodanig dat we een zicht krijgen op de relatieve context die werd gebruikt. We zien
5.2 Prestatie
44
Figuur 5.2: Cross-entropy fout in functie van het aantal lagen L
inderdaad dat de eerste 3 lagen een steeds langere context dragen. Het gedrag van de vierde en
vijfde laag wijkt af van wat we eerder zagen. Alle 50 tijdsstappen in het verleden die getraind
werden, blijken even belangrijk te zijn. De reden hiervoor is dat we de relatieve waarde bekijken
t.o.v. het maximum in elke laag. Stellen we Figuur 5.3 voor op een absolute niet-genormeerde
manier dan bekomen we Figuur 5.4. Hier is duidelijk te zien waarom elke invoer even belangrijk
is bij de vierde en vijfde laag. De absolute waarde van de gewenste invoer van de vierde en
vijfde laag is immers veel kleiner dan bij de eerste 3 lagen, en is zo goed als nul. Vandaar dat
de relatieve gewenste invoer overal groot was.
Figuur 5.3: Relatieve gewenste invoer per laag
5.2 Prestatie
45
Figuur 5.4: Absolute waarde gewenste invoer per laag
Als laatste bekijken we dan nog eens of dit zich op een gelijke manier vertaald in de functionaliteit van een drie-laags DRNN. Het resultaat van de gewenste invoer is te zien in Figuur 5.5.
Inderdaad, de context-afhankelijkheid van de derde laag in een drie-laags DRNN blijkt even
groot te zijn als in een vijf-laags DRNN, desondanks dat er meer neuronen per laag gebruikt
worden. Het lijkt erop dat bij het gebruikte trainingsproces we niet de benodigde context kunnen
aanleren aan de vierde en vijfde laag van het DRNN.
Figuur 5.5: Relatieve gewenste invoer per laag
5.3 Alternatieve leermethode
46
Als we nu de context beter bekijken zien we dat er in de derde laag tot ongeveer 30 tijdsstappen
terug wordt gegaan. Aan een samplerate van 25 per seconde, staat 30 tijdsstappen voor amper
1.2 seconden aan context. Gezien de taak is om ritme’s in muziek zelf te leren en dan voornamelijk om te leren wanneer een nieuwe noot wordt gespeeld, lijkt een context van 1.2 seconden
erg weinig en onvoldoende om de taak op een goeie wijze te volbrengen, ondanks de lage crossentropy error. Dit vraagt dus om een nadere vergelijking van de output y van het netwerk en
de targets die hierbij horen. Het resultaat van één zo’n noot zien we gedeeltelijk in Figuur 5.6.
Om duidelijk te tonen waar het probleem zit is er sterk ingezoomd op de overgang van een niet
gespeelde noot naar een wel gespeelde noot. Het probleem lijkt zeer duidelijk. Het netwerk leert
enkel om noten te herhalen, maar heeft moeite om zelf de overgangen te voorspellen. Daarom
komt de output y, dus één tijdsstap achter de targets. Niet enkel bij deze noot en deze overgang
is dit zo, het blijkt bijna overal zo te zijn. Het vermoeden van een niet lang genoege context
wordt door dit fenomeen dus versterkt. In een laatste poging om toch een netwerk te verkrijgen
die wel ritme’s kan modelleren, is er voor de taak nog een andere leermethode gebruikt.
Figuur 5.6: Vergelijking uitvoer netwerk versus target
5.3
Alternatieve leermethode
Om nu te focussen op het leren van de overgangen en niet op het enkel reproduceren van de laatste
gespeelde noten, gaan we een alternatieve leermethode gebruiken. Deze is deels vergelijkbaar
met de leermethode van de gewenste invoer. In die zin dat we een speciale fout gaan gebruiken
om terug te propageren doorheen het netwerk en om dus de gewichtenmatrices te trainen. Op
de tijdsstappen waar een overgang is, gaan we de fout vermenigvuldigen met een factor, zodanig
dat deze tijdsstappen belangrijker zijn in het trainingsproces. Op die manier hopen we toch een
5.3 Alternatieve leermethode
47
DRNN te krijgen die overgangen en ritme’s in muziek kan leren. Als factor hebben we 2, 5, 10
en 100 geprobeerd. De prestatie van het netwerk bleef grotendeels onveranderd zoals te zien
op Figuur 5.7. De kleine cross-entropy error van ongeveer 0.0245 is dus bijna volledig ontstaan
door het herhalen van de laatste invoer en niet door het leren van de overgangen. Zelfs wanneer
we de fout enkel behouden bij een overgang en op nul zetten bij een niet-overgang kwam er geen
verbetering in.
Figuur 5.7: Prestatie alternatieve leermethode t.o.v. het aantal lagen
Wanneer we dan gaan vergelijken tussen de uitvoer en de targets, zien we inderdaad in elk
van voorgaande gevallen dat opnieuw de uitvoer één tijdsstap achterloopt op de targets. Een
voorbeeld is gegeven in Figuur 5.8.
Figuur 5.8: Voorbeeld bij vergelijken uitvoeren van alternatieve leermethode t.o.v. targets
5.4 Voorspellen muziek
5.4
48
Voorspellen muziek
Desondanks het minder presteren van het netwerk op het leren van ritme’s, zijn we toch gaan
kijken of het zelf muziek kan genereren. Om dat te doen starten we met een initialisatie en laten
we het netwerk dan verder aanvullen. De uitvoer op de eerstvolgende stap na de initialisatie
geeft dan de probabliteit weer van de noot staat aan of uit. Uit deze probabiliteiten voor iedere
noot worden dan de nieuwe invoeren gesampled. Op die manier wordt er ‘muziek’ gegenereert
door het netwerk. Hieronder staan verschillende voorbeelden van de gegenereerde uitvoer. De
initialisatie is te zien vanaf tijdsstap 1200.
Figuur 5.9: Gegenereerde muziek door het getrainde netwerk. De initialisatie loopt tot tijdsstap
1200.
Figuur 5.10: Gegenereerde muziek door het getrainde netwerk. De initialisatie loopt tot tijdsstap
1200.
5.5 Samengevat
49
We zien dat er door het netwerk overgangen worden gemaakt van noot aan naar noot uit. Toch
hebben deze overgangen al heel snel niets meer te maken met het ritme dat de initialisatie
aangeeft. Als we eens gaan inzoomen naar net na het einde van de initialisatie zien we volgende
figuur:
Figuur 5.11: Gegenereerde muziek door het getrainde netwerk. Ingezoomd rond het einde van
de initialisatie.
De eerste tijdsstappen lijkt het nog deftig te verlopen, maar na 20 tijdsstappen is het het ritme
dus al volledig kwijt. De generatie van muziek vertoont dus alles behalve ritme, maar creëert
wel overgangen van aan naar uit.
5.5
Samengevat
Ondanks de goeie prestatie en de aangetoonde langere context per laag, lijkt het DRNN niet
geschikt voor deze taak. De gebruikte context is niet groot genoeg om muzikale ritme’s te
kunnen aanleren. Dit komt waarschijnlijk door een te hoge samplerate, deze kan moeilijk verder
gereduceerd worden zonder verlies van informatie en dus de invoer muzikaal te vervormen. Het
netwerk heeft grote moeilijkheden met het zelf voorspellen van overgangen in geleerde data en
blijft vaak enkel de vorige invoer reproduceren. Zelfs bij een alternatieve leermethode die focust
op enkel de overgangen van de noten tussen aan en af, blijkt er weinig verbetering te zijn. Het
doel van de thesis is dus wel aangetoond (betere prestatie en hogere context), maar de taak op
zich is niet echt geslaagd.
CONCLUSIE
50
Hoofdstuk 6
Conclusie
Het Diep Recurrent Neuraal Netwerk (DRNN) is een interessante uitbreiding van een gewoon
recurrent neuraal netwerk terwijl het trainingsalgoritme weinig complexer wordt. Naar analogie
met een diep neuraal netwerk, zouden de extra toegevoegde lagen een stijgende complexiteit
moeten waarborgen en dus een betere prestatie. De hypothese dat het een betere prestatie zou
teweeg brengen werd in deze thesis getoetst aan twee toepassingen. De betere prestatie werd
verwacht vooral een gevolg te zijn van een verbetering van de grootte van de context. Deze
grotere context wordt gebruikt om een betere invulling van de taak in kwestie te verkrijgen.
De eerste toepassing is een eerder standaard taak. Spraakherkenning aan de hand van de TIMIT
dataset moest aantonen of de hypothese al dan niet correct is. En inderdaad, de prestatie
afgebeeld op Figuur 4.1 blijkt te verbeteren in functie van het aantal lagen dat het DRNN
gebruikt. Dat dit het gevolg is van de stijgende context-afhankelijkheid volgt uit de gewenste
invoer voor iedere laag in een getraind DRNN. Figuur 4.3 toont op een mooie manier het vorige
aan. Hoe hoger de laag, hoe verder in het verleden gekeken wordt om een schatting te maken
van het juiste target-foneem.
De tweede meer uitdagende taak bestond erin ritme’s te leren uit symbolische muziek. Aan de
hand van een eigen dataset gemaakt uit klassieke piano muziek werd een DRNN getraind. Hoewel
de prestatie en de context-afhankelijkheid positief kunnen beoordeeld worden op Figuur 5.2 en
Figuur 5.3 bij een stijgend aantal lagen, toont deze taak toch een pijnpunt aan van het DRNN.
Het lijkt zo te zijn dat de correcte context aanleren erg uitdagend is. De context in ons DRNN
is maar 1.2 seconden (aan een samplerate van 25/sec) en dus te weinig om echte ritme’s in
muziek te kunnen ontdekken en aanleren. Overgangen tussen noot aan en uit worden dus amper
aangeleerd en het netwerk reproduceert vooral de laatste invoer bij de training. Het genereren
CONCLUSIE
51
van muziek lukt dan weer wel, mede door de sampling van de uitvoer. Resultaten daarvan zijn
te zien in Figuur 5.9 en Figuur 5.10, maar het DRNN kan geen ritme’s aanhouden.
BIBLIOGRAFIE
52
Bibliografie
[Bishop et al., 2006] Bishop, C. M. et al. (2006). Pattern recognition and machine learning,
volume 1. springer New York.
[Boyd and Chua, 1985] Boyd, S. and Chua, L. O. (1985). Fading memory and the problem of
approximating nonlinear operators with volterra series. Circuits and Systems, IEEE Transactions on, 32(11):1150–1161.
[Chen, 1982] Chen (1982). Topological structure in visual perception. Science, 218:699.
[Doya, 1993] Doya, K. (1993). Bifurcations of recurrent neural networks in gradient descent
learning. IEEE Transactions on Neural Networks, 1:75–80.
[Eck and Schmidhuber, 2002] Eck, D. and Schmidhuber, J. (2002). Learning the long-term
structure of the blues. In Artificial Neural NetworksICANN 2002, pages 284–289. Springer.
[Franklin, 2005] Franklin, J. A. (2005). Jazz melody generation from recurrent network learning
of several human melodies. In FLAIRS Conference, pages 57–62.
[Garofolo et al., 1993] Garofolo, J. S., Lamel, L. F., Fisher, W. M., Fiscus, J. G., and Pallett,
D. S. (1993). Darpa timit acoustic-phonetic continous speech corpus cd-rom. nist speech disc
1-1.1. NASA STI/Recon Technical Report N, 93:27403.
[Graves, 2013] Graves, A. (2013). Generating sequences with recurrent neural networks. arXiv
preprint arXiv:1308.0850.
[Graves et al., 2013] Graves, A., Mohamed, A.-r., and Hinton, G. (2013). Speech recognition
with deep recurrent neural networks. In Acoustics, Speech and Signal Processing (ICASSP),
2013 IEEE International Conference on, pages 6645–6649. IEEE.
[Hermans and Schrauwen, 2013] Hermans, M. and Schrauwen, B. (2013). Training and analysing deep recurrent neural networks. In Burges, C., Bottou, L., Welling, M., Ghahramani, Z.,
BIBLIOGRAFIE
53
and Weinberger, K., editors, Advances in Neural Information Processing Systems 26, pages
190–198. Curran Associates, Inc.
[Hochreiter and Schmidhuber, 1997] Hochreiter, S. and Schmidhuber, J. (1997). Long shortterm memory. Neural computation, 9(8):1735–1780.
[Ku and Lee, 1995] Ku, C.-C. and Lee, K. Y. (1995). Diagonal recurrent neural networks for
dynamic systems control. Neural Networks, IEEE Transactions on, 6(1):144–156.
[LeCun and Bengio, 1995] LeCun, Y. and Bengio, Y. (1995). Convolutional networks for images,
speech, and time series. The handbook of brain theory and neural networks, 3361.
[LeCun and Cortes, 1998] LeCun, Y. and Cortes, C. (1998). The mnist database of handwritten
digits.
[Martens, 2010] Martens, J. (2010). Deep learning via hessian-free optimization. In Proceedings
of the 27th International Conference on Machine Learning (ICML-10), pages 735–742.
[Mitchell, 1999] Mitchell, T. M. (1999). Machine learning and data mining. Communications
of the ACM, 42(11):30–36.
[Pang et al., 2002] Pang, B., Lee, L., and Vaithyanathan, S. (2002). Thumbs up?: sentiment
classification using machine learning techniques. In Proceedings of the ACL-02 conference on
Empirical methods in natural language processing-Volume 10, pages 79–86. Association for
Computational Linguistics.
[Pascanu et al., 2013] Pascanu, R., Gulcehre, C., Cho, K., and Bengio, Y. (2013). How to
construct deep recurrent neural networks. arXiv preprint arXiv:1312.6026.
[Rabiner, 1989] Rabiner, L. (1989). A tutorial on hidden markov models and selected applications in speech recognition. Proceedings of the IEEE, 77(2):257–286.
[Roman and Jameel, 1996] Roman, J. and Jameel, A. (1996). Backpropagation and recurrent
neural networks in financial analysis of multiple stock market returns. In System Sciences,
1996., Proceedings of the Twenty-Ninth Hawaii International Conference on,, volume 2, pages
454–460. IEEE.
[Samuel, 1962] Samuel, A. L. (1962).
Artificial intelligence–a frontier of automation.
Information Technology, 4(1-6):173–177.
it-
BIBLIOGRAFIE
54
[Sutskever et al., 2011] Sutskever, I., Martens, J., and Hinton, G. E. (2011). Generating text
with recurrent neural networks. In Proceedings of the 28th International Conference on Machine Learning (ICML-11), pages 1017–1024.
[Vallabhaneni et al., 2005] Vallabhaneni, A., Wang, T., and He, B. (2005). Braincomputer interface. In Neural Engineering, pages 85–121. Springer.
[Viola and Jones, 2001] Viola, P. and Jones, M. (2001). Rapid object detection using a boosted
cascade of simple features. In Computer Vision and Pattern Recognition, 2001. CVPR 2001.
Proceedings of the 2001 IEEE Computer Society Conference on, volume 1, pages I–511. IEEE.
[Werbos, 1990] Werbos, P. J. (1990). Backpropagation through time: what it does and how to
do it. Proceedings of the IEEE, 78(10):1550–1560.
Download