building your first deep neural network- introduction to regularization (part 3)

Three-layer network on MNIST

The following code snippet illustrates the step for building a simple three layer neural network to recognize 1000 mnist images

Well, that was easy

In some ways, this is a real victory. The neural network was able to take a dataset of 1,000 images and learn to correlate each input image with the correct label. How did it do this? It iterated through each image, made a prediction, and then updated each weight ever so slightly so the prediction was better next time. Doing this long enough on all the images eventually reached a state where the network could correctly predict on all the images. Here’s a non-obvious question: how well will the neural network do on an image it hasn’t seen before? In other words, how well will it do on an image that wasn’t part of the 1,000 images it was trained on? The MNIST dataset has many more images than just the 1,000 you trained on; let’s try it. In the notebook from the previous code are two variables: test_images and test_labels. If you execute the following code, it will run the neural network on these images and evaluate how well the network classifies them

Theo một cách hiểu nào đó thì đây là một chiến thắng thực sự. Mạng neuron có thể lấy 1000 bức hình và học được sự tương quan của mỗi một bức hình đầu vào và nhãn đúng của nó. Vậy nó làm điều này như thế nào? nó lặp qua mỗi một bức hình, tạo một phỏng đoán và sau đó thì cập nhật trọng số để cho việc phỏng đoán tốt hơn cho những lần sau. Thực hiện điều này đủ lâu trên toàn bộ các bức ảnh sẽ dẫn đến trạng thái khi mà mạng neuron có thể đoán được một cách chính xác tất cả các bức ảnh. Một câu hỏi được đặt ra là: mạng neuron sẽ có những tiên đoán như thế nào về những bức hình mà nó chưa nhìn thấy trước đây? Nói cách khác liệu rằng mạng neuron có thể đưa ra những tiên đoán chính xác cho những bức hình mà không nằm trong 1000 bức hình kia hay không? bộ dữ liệu MNIST có đến hơn 1000 dữ liệu; hãy thử điều đó. Đoạn code dưới đây sẽ biểu đạt điều đó

The network did horribly! It predicted with an accuracy of only 70.7%. Why does it do so terribly on these new testing images when it learned to predict with 100% accuracy on the training data? How strange. This 70.7% number is called the test accuracy. It’s the accuracy of the neural network on data the network was not trained on. This number is important because it simulates how well the neural network will perform if you try to use it in the real world (which gives the network only images it hasn’t seen before). This is the score that matters.

Mạng neuron thể hiện rất tệ! nó chỉ đoán đúng với độ chính xác là ~70%. Vì sao nó lại tệ như vậy trên các dữ liệu test mới . Con số 70% này gọi là độ chính xác khi kiểm tra mô hình. Đó là độ chính xác của mạng neuron trên các dữ liệu chưa được huấn luyện. Con số này vô cùng quan trọng, vì nó mô phỏng được mức độ tốt của mô hình trong thực tế

Memorization vs. generalization

Let’s consider again how a neural network learns. It adjusts each weight in each matrix so the network is better able to take specific inputs and make a specific prediction. Perhaps a better question might be, “If we train it on 1,000 images, which it learns to predict perfectly, why does it work on other images at all?” As you might expect, when the fully trained neural network is applied to a new image, it’s guaranteed to work well only if the new image is nearly identical to an image from the training data. Why? Because the neural network learned to transform input data to output data for only very specific input configurations. If you give it something that doesn’t look familiar, it will predict randomly. This makes neural networks kind of pointless. What’s the point of a neural network working only on the data you trained it on? You already know the correct classifications for those datapoints. Neural networks are useful only if they work on data you don’t already know the answer to.

hãy xem xét lại một lần nữa mạng neuron học thế nào, nó điều chỉnh mỗi trọng số ở trong mỗi ma trận để mạng neuron có thể làm tốt hơn trong việc lấy 1 dữ liệu đầu vào và tạo ra được một sự tiên đoán. Có thể một câu hỏii tốt hơn ở đây là “nếu chúng ta huấn luyện mô hình trên 1000 hình ảnh và nó học hoàn hảo tại sao nó lại hoạt động trên các hình ảnh khác”. Cũng như bạn mong đợi, khi một mạng neuron được huấn luyện đầy đủ được áp dụng cho một hình ảnh mới, nó chỉ đảm bảo được sự hoạt động hiệu quả của mạng neuron nếu những hình ảnh mới gần như tương tự với hình ảnh huấn luyện. Tại Sao? bởi vì mạng neuron học cách chuyển đổi từ dữ liệu đầu vào sang dữ liệu đầu ra cho 1 thiết lập cụ thể của đầu vào. Nếu bạn đưa cho nó một dữ liệu đầu vào mà nó không thấy quen nó sẽ tiên đoán một cách ngẫu nhiên. Điều này khiến cho mạng neuron hoàn toàn vô dụng. Mạng neuron có tác dụng gì nếu nó chỉ hoạt động trên dữ liệu mà nó được huấn luyện. Mạng neuron chỉ thật sự hữu ích nếu nó hoạt động trên những dữ liệu mà bạn không hề biết câu trả lời

Where overfitting comes from

Let’s alter this scenario a bit. Picture the fresh clay again (unmolded). What if you pushed only a single fork into it? Assuming the clay was very thick, it wouldn’t have as much detail as the previous mold (which was imprinted many times). Thus, it would be only a very general shape of a fork. This shape might be compatible with both the three- and four-pronged varieties of fork, because it’s still a fuzzy imprint. Assuming this information, the mold got worse at the testing dataset as you imprinted more forks because it learned more-detailed information about the training dataset it was being molded to. This caused it to reject images that were even the slightest bit off from what it had repeatedly seen in the training data. What is this detailed information in the images that’s incompatible with the test data? In the fork analogy, it’s the number of prongs on the fork. In images, it’s generally referred to as noise

lấy một ví dụ. Bạn có 1 miếng đất sét tươi chưa được tạo khuôn. Điều gì xảy ra nếu bạn ấn một chiếc nĩa vào nó? giả sử rằng đất sét rất dày và bạn không có quá nhiều chi tiết về khuôn trước đó. Do đó nó sẽ chỉ là một khuôn mẫu rất chung chung về hình dạng chiếc nĩa. Dạng mẫunày sẽ có thể tương ứng với nhiều dạng nĩa khác nhau bởi vì nó vẫn là một mẫu in không ổn định. Khuôn mẫu này sẽ càng ngày càng tệ đi khi nó được học những thông tin chi tiết về những mẫu dữ liệu nó được huấn luyện. Điều này khiến cho nó từ chối những hình ảnh mà chỉ cần khác biệt đôi chút với dữ liệu trong tập huấn luyện. Thông tin chi tiết nào ở trong bức ảnh mà lại không tương thích với tập dữ liệu kiểm tra? đó là thông tin về số ngạnh của chiếc nĩa. Nó có thể xem như độ nhiễu

The simplest regularization: Early stopping

How do you get a neural network to ignore the fine-grained detail and capture only the general information present in the data (such as the general shape of a dog or of an MNIST digit)? You don’t let the network train long enough to learn it. In the fork-mold example, it takes many forks imprinted many times to create the perfect outline of a three-pronged fork. The first few imprints generally capture only the shallow outline of a fork. The same can be said for neural networks. As a result, early stopping is the cheapest form of regularization

làm như thế nào để mạng neuron có thể bỏ qua những chi tiết mà chỉ thu nhận những thông tin tổng quát trong dữ liệu ví dụ hình dạng chung của con chó hoặc một kí tự MNIST. Bạn không cho mạng neuron được huấn luyện đủ lâu để học nó. Trong ví dụ về khuân nĩa, mất rất nhiều mẫu in của nĩa và nhiều lần để có thể tạo ra khuôn của chiếc nĩa 3 ngạnh . Một vài bản in đầu chỉ thu được những khuôn “nông” của chiếc nĩa. Điều tương tự xảy ra cho mạng neuron. Kết quả là, “Dừng huấn luyện sớm” là một cách khá hữu ích cho việc tổng quát hoá mô hình

Industry standard regularization: Dropout

This regularization technique is as simple as it sounds. During training, you randomly set neurons in the network to 0 (and usually the deltas on the same nodes during back-propagation, but you technically don’t have to). This causes the neural network to train exclusively using random subsections of the neural network. Believe it or not, this regularization technique is generally accepted as the go-to, state-of-the-art regularization technique for the vast majority of networks. Its methodology is simple and inexpensive, although the intuitions behind why it works are a bit more complex

Kĩ thuật tổng quát hoá này rất đơn giản. Trong suốt thời gian huấn luyện, bạn ngẫu nhiên chọn những neuron trong mạng và đặt giá trị 0 cho nó. Điều này khiến cho mạng buộc phải dùng ngẫu nhiên những mạng nhỏ hơn. Bạn có thể tin hay không thì tuỳ, cách tổng quát hoá này được chấp nhận như là cách tổng quát hoá tiêu chuẩn cho rất nhiều kiến trúc mạng. Cách thực hiện nó đơn giản, mặc dù nguyên nhân đằng sau vì sao nó hoạt động thì có thể khá phức tạp

To implement dropout on a layer (in this case, layer_1), multiply the layer_1 values by a random matrix of 1s and 0s. This has the effect of randomly turning off nodes in layer_1 by setting them to equal 0. Note that dropout_mask uses what’s called a 50% Bernoulli distribution such that 50% of the time, each value in dropout_mask is 1, and (1–50% = 50%) of the time, it’s 0. This is followed by something that may seem a bit peculiar. You multiply layer_1 by 2. Why do you do this? Remember that layer_2 will perform a weighted sum of layer_1. Even though it’s weighted, it’s still a sum over the values of layer_1. If you turn off half the nodes in layer_1, that sum will be cut in half. Thus, layer_2 would increase its sensitivity to layer_1

để triển khai drop-out ở một layer (trong trường hợp này, layer_1), nhân layer_1 với một ma trận ngẫu nhiên của 1s và 0s. Điều này có tác dụng ngẫu nhiên tắt đi một số nút ở layer_1 bằng cách đặt giá trị của chúng là 0. Chú ý rằng drop-out sử dụng cái gọi là 50% phân bố Bernoulli mà trong đó mỗi lần, mỗi giá trị trong dropout_mask là 1 và 1–50% = 50% thời gian nó là 0. theo sau đó là 1 vấn đề bạn sẽ có cảm giác lạ. chúng ta nhân layer_1 bởi 2. Tại sao chúng ta lại làm điều này. Hãy nhớ rằng layer_2 sẽ thực hiện tổng trọng số của layer_1. Mặc dù nó là trọng số, nó vẫn chỉ là tổng của tất cả giá trị ở layer_1. Nếu bạn tắt một nửa nút ở layer_1 thì tổng số sẽ bị giảm đi một nữa. Do đó layer_2 phải tăng độ nhạy với layer_1

Có thể thấy được rằng kết quả của test acc tăng lên đáng kể theo cách này

The code for this blog can be found at

https://github.com/ngduyanhece/medium_ai_tutor/blob/master/dl_from_scratch/three_layers_mnist.ipynb

AI Researcher - NLP Practitioner