THẢO LUẬN

Avatar
đã bình luận câu trả lời trong câu hỏi
thg 9 6, 2017 6:23 CH

Mình thấy một vấn đề khá quen thuộc khi training một NN đó là Vanishing Gradients - gradient error sẽ nhỏ dần trong quá trình backpropagation. Đến một thời điểm nào đó connection weights của các layer thấp hơn sẽ không thay đổi (khi sử dụng Gradient Descent chẳng hạn), quá trình trainning sẽ không tìm được một kết quả tốt. Ngược lại nếu gradient lớn dần trong quá trình backpropagation thì sẽ dẫn đến hiện tượng Exploding Gradients - cũng không tốt một chút nào.

Có hai nguyên nhân chính dẫn đến hiện tượng trên:

  • Sử dụng saturating activation function (ví dụ như signmoid function)
  • Kĩ thuật khởi tạo các connection weights (weight initialization)

Ví dụ trong trường hợp sigmoid function, khi input lớn thì function sẽ trở nên bão hòa (saturating) tại 0 và 1, đạo hàm rất gần với 0, gradients trong quá trình backpropagation sẽ nhỏ dần khi đến các layer thấp hơn.

Signmoid

ReLU và các biến thể của nó thường được sử dụng thay cho sigmoid function, do nó không có hiện tượng bão hòa và khá nhanh khi tính toán.

ReLU(z)=max(0,z)ReLU(z) = max(0, z)

Tuy nhiên khi sử dụng ReLU chúng ta gặp phải một hiện tượng đó là Dying ReLUs, khi một số neuron sẽ chỉ cho ra giá trị là 0 trong quá trình trainning (khi connection weights của neuron được update và weighted sum của các inputs nhỏ hơn 0 -> output = 0 -> gradient = 0). Để giải quyết vấn đề này thì chúng ta sẽ dùng một số biến thể của ReLU.

Leaky ReLU

Ref: https://en.wikipedia.org/wiki/Rectifier_(neural_networks)#Leaky_ReLUs Ref: https://arxiv.org/pdf/1505.00853.pdf

LeakyReLU(z)=max(αz,z)LeakyReLU(z) = max(\alpha z, z)

Leaky ReLU

Ở đây alpha có tác dụng điều chỉnh độ dốc của hàm khi z < 0. Thay vì bằng 0 như trong ReLU output sẽ có giá trị thay đổi, tránh được hiện tượng dying ReLUs.

RReLU - Randomized Leaky ReLU

Tương tự như Leaky ReLU nhưng alpha sẽ được chọn ngẫu nhiên trong một khoảng nào đó khi training và được giữ nguyên trong quá trình testing -> tránh được hiện tượng overfitting.

RReLU

PReLU - Parametric Leaky ReLU

Ở biến thể này thì alpha sẽ được "learn" trong quá trình trainning thay vì là một hyperparameter. Nó hoạt động khá tốt khi dataset lớn nhưng có thể dẫn đến overfitting nếu dataset quá nhỏ.

PReLU

ELU - Exponential Linear Unit

Ref: https://en.wikipedia.org/wiki/Rectifier_(neural_networks)#ELUs

ELU(z)={zif z>=0α[exp(z)1]otherwise  ELU(z) = \begin{cases} z &\text{if } z >= 0 \\ \alpha [\exp(z) - 1] &\text{otherwise } \end{cases}

def elu(z, alpha=1):
    return np.where(z<0, alpha*(np.exp(z)-1), z)

ELU có performance khá tốt so với các biến thể trước đó của ReLU, với một số cải tiến như sau:

  • Cho ra giá trị âm khi z < 0, giá trị trung bình của đầu ra sẽ gần với 0 -> tránh được hiện tượng vanishing gradients
  • Gradient sẽ khác 0 khi z < 0 -> tránh được hiện tượng dying ReLUs
  • ELU là một hàm khá trơn -> việc sử dụng Gradient Descent sẽ hiệu quả hơn

ELU

SELU (Scaled Exponential Linear Units)

Ref: https://arxiv.org/pdf/1706.02515.pdf Ref: SELU + Dropout: https://github.com/bioinf-jku/SNNs/blob/master/selu.py

SELU(z)=λ{zif z>0α[exp(z)α]if z<=0 SELU(z) = \lambda \begin{cases} z &\text{if } z > 0 \\ \alpha [\exp(z) - \alpha] &\text{if } z <= 0 \end{cases}

def elu(z, alpha=1):
    return np.where(z < 0, alpha * (np.exp(z) - 1), z)


def selu(z,
         scale=1.0507009873554804934193349852946,
         alpha=1.6732632423543772848170429916717):
    return scale * elu(z, alpha)

Một loại activation function khá mới (2017) và có performance rất tốt so với các loại activation function khác.

SELU

Kết luận

Thông thường: ELU > Leaky ReLU (và các biến thể của nó) > ReLU > tanh > logistic (signmoid) Nếu quan tâm đến thời gian training: Leaky ReLUs > ELUs Thông thường giá trị của alpha sẽ là 0.01 cho leaky ReLU và 1 cho ELU Sử dụng RReLU nếu model overfitting tập training, PReLU nếu tập training lớn

:slight_smile: 😃 😄

+3
thg 9 6, 2017 3:12 CH

Bài viết hay quá cảm ơn bạn. mà mục 8 chuyện 2 mình thấy nên đổi thành a.equals(input) để tránh NPE nếu input vào là null

+1
thg 9 6, 2017 11:18 SA

Cho mình xin query của bạn 😄

0
thg 9 6, 2017 7:55 SA

getANumberObservable() //this will run on main thread .observeOn(Schedulers.io()) .map(new Func1<Integer, String>() { // this will run on a thread intended for I/O bound @Override public String call(Integer integer) { Log.i("Operator thread", Thread.currentThread().getName()); return String.valueOf(integer); } }) .subscribe(new Action1<String>() { // this will run on a thread intended for I/O bound @Override public void call(String s) { Log.i("Subscriber thread", Thread.currentThread().getName()); } });

Observable thread: main Operator thread: RxIoScheduler-2 // io Subscriber thread: RxIoScheduler-2 // io

Chào bạn. Cho mình hỏi sample của bạn gọi hàm .observeOn(Schedulers.io()) thì subscribe() sẽ chạy trên RXIOThread, vậy tại sao observable lại chạy trên main vậy, vì lúc đầu có nói nếu ko để subribeOn() thì mặc định Oservable sẽ chạy trên thread của nào chạy hàm subscribe, mà lúc này nó là RXIOThread

0
thg 9 6, 2017 7:09 SA

greate topic

0
Avatar
đã bình luận cho bài viết
thg 9 6, 2017 7:01 SA

(y)

0
thg 9 6, 2017 6:40 SA

Có, hiện tại mình đang sử dụng pycharm cho việc code python và phpstorm phục vụ cho php.

+1
Avatar
đã bình luận cho bài viết
thg 9 6, 2017 5:53 SA

Bạn thử dùng pycharm để code python chưa?

0

ad đâu rồi hihi

+1
Avatar
đã bình luận câu trả lời trong câu hỏi
thg 9 6, 2017 3:02 SA

Bạn dùng Singapore đi

0
thg 9 6, 2017 2:24 SA

Mình có làm theo tutorial này kết hợp Redux. Nhưng phải cài đặt thêm theo tutorial https://reacttraining.com/react-router/web/guides/redux-integration thì mới render đúng trang được khi click vào link. Nếu không phải F5 lại trang mới render đúng. Không biết mình có làm sai chỗ nào không?

// before
export default connect(mapStateToProps)(Something)

// after
import { withRouter } from 'react-router-dom'
export default withRouter(connect(mapStateToProps)(Something))```
0
thg 9 6, 2017 1:58 SA

nếu ko qua java thì cách tốt nhất bạn lên làm là theo cách của @Cùi Bắp nhé

0
thg 9 6, 2017 1:28 SA

Hi bạn, AngularJs là client site, trong khi Java là server site, nên với resource từ phía server site nếu bạn muốn sử dụng nó thì hãy tạo một request get đến server rồi trả về trong result của request nhé. vì clientsite sẽ ko tự động có được các Dữ liệu từ phía server mà bạn cần lấy nó về từ servers nghĩa là bạn cần phát sinh request trả về các message ở trong context dạng Json sau đó binding vào ng-bind

có một cách là bạn có thể tham khảo sử dụng angular-translate : https://gist.github.com/rvillars/6422287

+1
thg 9 6, 2017 1:18 SA

@hocdv đưa nó ra html mà ko cần qua java thì bạn nên dùng json file, hãy đặt file json đó trong thư mục public, rồi get về khi khởi chạy angular app. Ex: http://embed.plnkr.co/I1aLZg/

+1
Avatar
đã bình luận cho bài viết
thg 9 6, 2017 12:19 SA

Cảm ơn bác! Em cũng đang bắt đầu tìm hiểu ...

0
thg 9 5, 2017 4:49 CH

Keep forward. Tác giả noi mấy chương đầu chỉ là nhạc dạo lý thuyết thôi, các chương thực hành sau mới là quan trọng 😄

+1
thg 9 5, 2017 4:36 CH

Mình cũng đang đọc cuốn này, vào comment cho xôm 😄. Mình thì thích quan điểm của Michael Feathers, đại ý là ông ấy cho rằng Clean Code là khi người Code quan tâm tới dòng Code mình viết ra. Ví dụ hồi mới làm dự án, mình thường Comment một đống vào trong Code để cho người làm sau hiểu được đoạn code mình đang viết có ý nghĩa là gì. Thậm chí cố Format code cho thật đẹp, ident thẳng hàng cho dễ đọc. Cho nên dù code chưa được tối ưu, nhưng những bạn phải Maintain code của mình cảm thấy khá thoải mái khi đọc và sửa mà không cần ra vỗ vai mình để hỏi Mình cũng hay maintain dự án, chuyện gặp 1 function dài 800 dòng code không phải chuyện hiếm. Đôi lúc đọc mất mấy giờ nhưng cuối cùng sửa chỉ có 1 dòng là ra kết quả. Còn tư tưởng Clean Code của mình, trước khi đọc cuốn này là: Lam sao cho code thật ngắn mà vẫn dễ đọc, function phải chia thật nhỏ để tái sử dụng. Hy vọng đọc xong sẽ thu nhặt thêm được nhiều cái hay.

+1

@notipham tại mình đặt quest mà chưa có đáp án nên mới vầy 😃. nếu rảnh bạn giúp mình với https://viblo.asia/q/giup-do-su-dung-noi-dung-properties-len-file-html-yDZO719QZwj . Cảm ơn!

0

@hocdv Viblo có riêng một chuyên mục Hỏi & Đáp tại địa chỉ https://viblo.asia/questions Bạn có thể vào đó đặt câu hỏi để nhận được sự giúp đỡ của những người dùng Viblo khác nhé 😉

0

Anh ơi cho em hỏi 1 chút về Angularjs nhưng không liên quan tới chủ đề bài viết được không ạ?

0
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí