현재 인기있는 딥 러닝의 경우 학습 정신을 유지해야합니다. 프로그래머, 특히 건축가는 항상 핵심 기술과 주요 알고리즘에 대해 걱정해야하며 필요한 경우 작성하고 마스터해야합니다. 그것을 사용하는시기에 신경 쓰지 마십시오. 사용 여부는 정치적 문제인지 또는 글을 쓸지 여부는 기술적 인 문제 일 것입니다.
프로그래머가 기계 학습을 배우는 방법
프로그래머의 경우 머신 러닝에는 특정 임계 값이 있습니다 (이 임계 값도 핵심 경쟁력입니다). 나는 많은 사람들이 기계 학습을 학습 할 때 수학 공식으로 가득 찬 영어 논문에 두통을 겪을 것이라고 생각합니다. 그러나 실제로 머신 러닝 알고리즘 구현 프로그램은 쓰기가 어렵지 않습니다. 다음은 70 줄의 코드, 즉 딥 러닝으로 구현 된 역 다중 계층 (BP) 신경망 알고리즘입니다. 실제로, 그것은 신경망뿐만 아니라 로지스틱 회귀, 의사 결정 트리 C45/ID3, 랜덤 포레스트, 베이지안, 협업 필터링, 그래프 컴퓨팅, Kmeans, PageRank 등과 같은 대부분의 기계 학습 알고리즘은 100 줄의 독립형 프로그램으로 구현할 수 있습니다 (나중에 고려하십시오).
머신 러닝의 실제 어려움은 왜 이와 같이 계산하는지, 그 뒤에있는 수학적 원리는 무엇이며, 공식을 추론하는 방법에 있습니다. 인터넷에 대한 대부분의 정보는 이론적 지식 의이 부분을 소개하지만 알고리즘의 계산 프로세스 및 프로그램 구현이 어떻게되는지는 거의 알려주지 않습니다. 프로그래머의 경우 엔지니어링 애플리케이션 만 사용하는 것이며 새로운 수학적 계산 방법을 증명하지는 않습니다. 실제로 대부분의 기계 학습 엔지니어는 다른 사람이 작성한 오픈 소스 패키지 또는 도구 소프트웨어를 사용하여 데이터를 입력하고 계산 계수를 조정하여 결과를 훈련시키고 알고리즘 프로세스를 거의 구현하지 않습니다. 그러나 각 알고리즘의 계산 프로세스를 마스터하는 것이 여전히 매우 중요합니다. 따라서 알고리즘이 데이터를 만든 변경 사항과 알고리즘이 달성하는 데 어떤 영향을 미치는지 이해할 수 있습니다.
이 기사는 역 신경망의 단일 기계 구현에 중점을 둡니다. 신경 네트워크의 다기체 병렬화와 관련하여, Fourinone은 매우 유연하고 완전한 병렬 컴퓨팅 프레임 워크를 제공합니다. 우리는 분산 병렬화 솔루션을 생각하고 설계하기 위해 독립형 프로그램의 구현 만 이해하면됩니다. 알고리즘 계산 프로세스를 이해하지 못하면 모든 아이디어를 확장 할 수 없습니다. 또한,이 기사의 범위 내에 있지 않은 이미지 처리에 사용되는 차원 감소 아이디어 인 Convolutional Neural Network도 있습니다.
신경망 프로세스 설명 :
우선, 신경망이 예측 작업을 수행한다는 점을 분명히하는 것이 중요합니다. 나는 당신이 고등학교에서 배운 가장 적은 사각형 방법을 기억한다고 믿습니다. 우리는 이것을 사용하여 덜 엄격하지만 직관적 인 비유를 만들 수 있습니다.
먼저 데이터 세트 및 데이터 세트의 마커를 얻고 싶습니다 (최소 제곱 방법에서는 x 및 y 값 세트도 얻습니다).
알고리즘은이 데이터 세트와 해당 마크를 기반 으로이 데이터 세트를 표현할 수있는 함수 매개 변수에 적합합니다 (즉, 최소 제곱 방법에서 A와 B를 계산하는 공식이지만이 공식은 신경망에서 직접 얻을 수 없습니다).
우리는 적합 함수를 얻습니다 (즉, 최소 제곱 방법에서 적합선 y^= Ax+B).
다음으로, 새로운 데이터를 가져온 후, 해당 예측 값 y^를 생성 할 수 있습니다 (최소 제곱 방법에서는 예측 된 y^를 얻기 위해 y^= ax+B를 가져 오는 것이 신경 네트워크 알고리즘이지만, 획득 된 기능은 최소 제곱 방법보다 훨씬 더 복잡합니다).
신경망의 계산 프로세스
신경망의 구조는 아래 그림에 나와 있습니다. 가장 왼쪽은 입력 레이어이고, 가장 오른쪽은 출력 레이어이고, 중간은 다중 숨겨진 레이어입니다. 숨겨진 층과 출력 층의 각 신경 노드는 이전 레이어 노드에 무게를 곱하여 축적됩니다. "+1"으로 표시된 원은 절편 용어 b입니다. 입력 레이어 외부의 각 노드에 대해 y = w0*x0+w1*x1+…+Wn*xn+b, 신경망은 다층 로지스틱 회귀 구조와 동일하다는 것을 알 수 있습니다.
알고리즘 계산 프로세스 : 입력 레이어가 시작되고 왼쪽에서 오른쪽으로 계산되며 출력 레이어가 결과를 생성 할 때까지 레이어별로 전방 레이어를 이동합니다. 결과 값과 목표 값 사이에 차이가있는 경우 오른쪽에서 왼쪽으로 계산하고 레이어별로 각 노드 레이어의 오차를 계산하고 각 노드의 모든 가중치를 조정하십시오. 입력 레이어에 리버스에 도달 한 후 다시 전달하고 모든 가중치 매개 변수가 합리적인 값으로 수렴 될 때까지 위의 단계를 반복하십시오. 컴퓨터 프로그램은 방정식 매개 변수를 해결하고 수학적 방법이 다르기 때문에 일반적으로 매개 변수를 무작위로 선택한 다음 올바른 값에 접근 할 때까지 오류를 줄이기 위해 매개 변수를 지속적으로 조정하고 대부분의 기계 학습은 지속적으로 반복 교육입니다. 프로그램 에서이 프로세스의 구현을 자세히 살펴 보겠습니다.
신경망의 알고리즘 프로그램 구현
신경망의 알고리즘 프로그램 구현은 초기화, 전방 계산 결과 및 가중치의 역 수정의 세 가지 프로세스로 나뉩니다.
1. 초기화 프로세스
N- 레이어 신경망이므로 2 차원 배열 레이어를 사용하여 노드 값을 기록합니다. 첫 번째 차원은 레이어 수이고, 두 번째 차원은 레이어의 노드 위치이고, 배열 값은 노드 값입니다. 마찬가지로, 노드 오류 값 레이어러도 비슷한 방식으로 기록됩니다. 3 차원 배열 Layer_weight를 사용하여 각 노드의 가중치를 기록하십시오. 첫 번째 차원은 레이어 수이고, 두 번째 차원은 레이어의 노드 위치이고, 3 차원은 하부 레이어 노드의 위치이고, 배열의 값은 하단 레이어에 도달하는 노드의 중량 값이며, 초기 값은 0-1 사이의 임의 숫자입니다. 수렴 속도를 최적화하기 위해 운동량 방법 무게 조정이 여기에서 사용됩니다. 마지막 중량 조정량을 기록하고 3 차원 배열 Layer_weight_delta를 사용하여 기록해야합니다. 절편 용어 처리 : 프로그램은 인터셉트 값을 1로 설정하여 무게 만 계산하면됩니다.
2. 결과를 앞으로 계산하십시오
S 함수 1/(1+math.exp (-z))는 각 노드의 값을 0-1로 통합하는 데 사용됩니다. 그런 다음 출력 레이어까지 레이어별로 IT 층을 계산합니다. 출력 레이어의 경우 실제로 S 함수를 사용할 필요가 없습니다. 출력 결과를 0과 1 사이의 확률 값으로 간주하므로 S 함수도 사용되며 프로그램의 균일성에도 도움이됩니다.
3. 무게를 역 수정합니다
신경망에서 오류를 계산하는 방법은 일반적으로 제곱 오차 함수 E를 사용합니다.
즉, 다중 출력 항 및 해당 대상 값의 오류의 제곱은 2로 축적되어 나뉩니다. 실제로 로지스틱 회귀의 오류 함수입니다. 이 기능이 오류를 계산하는 데 사용되는 이유, 수학적 합리성은 무엇이며 얻는 방법에 대해서는 프로그래머가 수학자가되기를 원하지 않으므로 깊이 들어 가지 마십시오. 우리가 지금해야 할 일은이 함수의 오류의 최소 값을 취하는 방법과 파생어를 필요로하는 방법입니다. 파생 상품 수학의 기본 사항이있는 경우 기능의 파생 중량에서 다음 공식을 얻는 방법을 추론 할 수 있습니다.
우리가 그것을 추론 할 수 없는지는 중요하지 않습니다. 결과 공식 만 사용하면됩니다. 우리의 프로그램에서, 우리는 Layererr를 사용하여 E의 중량 파생 후 최소화 된 오류를 기록한 다음 최소화 된 오류에 따라 가중치를 조정합니다.
모멘텀 방법은 여기에서 현지 최소값으로 떨어지지 않도록 이전 조정의 경험을 고려하여 여기에 사용됩니다. 아래의 K는 반복 수를 나타내고, MOBP는 운동량 항이며, 속도는 학습 단계입니다.
ΔW (k+1) = mobp*ΔW (k)+속도*err*층
아래에는 많은 공식이 있으며, 그 차이는 너무 크지 않습니다.
ΔW (k+1) = mobp*ΔW (k)+(1-mobp) 속도*err*층
성능을 향상시키기 위해 프로그램 구현은 오류를 계산하고 잠시 동안 가중치를 조정하는 것입니다. 먼저, 두 번째 - 마지막 층 (즉, 마지막 숨겨진 층)에 위치를 배치 한 다음 뒷쪽 층으로 가중치 층을 조정하십시오. L+1 층으로 계산 된 오차에 따라 L 층의 중량을 조정하고 L 층의 오차를 계산하고 다음에 순환 할 때 중량을 계산하여 첫 번째 층의 끝까지 가중치를 계산합니다 (입력 층).
요약
전체 계산 프로세스 중에 노드의 값은 계산 될 때마다 변경되며 저장할 필요가 없습니다. 가중치 매개 변수 및 오류 매개 변수를 저장해야하며 다음 반복을 지원해야합니다. 따라서 분산 된 멀티 머신 병렬 컴퓨팅 솔루션을 생각하면 다른 프레임 워크에 매개 변수 서버의 개념이 있는지 이해할 수 있습니다.
다층 신경망의 완전한 프로그램 구현
다음 구현 프로그램 BPDEEP.java는 직접 사용할 수 있으며 C, C#, Python 등과 같은 다른 언어 구현으로 쉽게 수정할 수 있습니다. 이는 모두 기본적인 진술이 아니며 다른 Java 라이브러리가 없기 때문입니다 (임의의 기능 제외).
import java.util.random; public class bpdeep {public double [] [] [] []] // 신경 네트워크 노드 public double [] [] layererr; // 신경망 노드 오류 public double [] [] layer_weight; // 신경 레이어 노드 웨이트 웨이트 퍼블릭 _delta; // 신경 verequege voughior _delta; 속도; // 학습 계수 public bpdeep (int [] Layernum, Double Rate, Double Mobp) {this.mobp = mobp; this.rate = rate; 레이어 = 새로운 이중 [Layernum.length] []; Layererr = 새로운 이중 [Layernum.length] []; layer_weight = 새로운 이중 [Layernum.length] [] []; layer_weight_delta = 새로운 이중 [Layernum.length] [] []; 랜덤 random = new random (); for (int l = 0; l <layernum.length; l ++) {layer [l] = new Double [layernum [l]]; Layererr [l] = 새로운 이중 [Layernum [l]]; if (l+1 <layernum.length) {layer_weight [l] = new Double [layernum [l] +1] [Layernum [l+1]]; layer_weight_delta [l] = 새로운 이중 [Layernum [l] +1] [Layernum [l+1]]; (int J = 0; l = 1; l <layer.length; l ++) {for (int j = 0; j <layer [l] .length [l] .length; j ++) {double z = layer_weight [l-1] [layer [l-1] .length] [j]; for (int i = 0; i <레이어 [l-1] .length; length; i ++) {[l-1] [i] = l == 1? [i] : 레이어 [l-1] [i]; z+= Layer_weight [l-1] [i] [J]*층 [l-1] [i]; } 레이어 [l] [j] = 1/(1+math.exp (-z)); }} 리턴 레이어 [Layer.Length-1]; } // 레이어별로 오류 레이어를 반대 계산하고 가중치 공개 void updateweight (double [] tar) {int l = layer.length-1; for (int j = 0; while (l-> 0) {for (int j = 0; j <layererr [l] .length; j ++) {double z = 0.0; for (int i = 0; i <layererr [l+1] .length; i ++) {z = z+l> 0? layererr [l+1] [i]*layer_weight [l] [J] [i] : 0; layer_weight_delta [l] [j] [i] = mobp*layer_weight_delta [l] [J] [i]+rate*layererr [l+1] [i]*layer [l] [J]; // 임플란트 레이어 모멘텀 조정 Layer_weight [l] [i]+= Layer weight_delta [l] if (j == layererr [l] .length-1) {layer_weight_delta [l] [j+1] [i] = mobp*layer_weight_delta [l] [j+1] [i]+속도*layererr [l+1]; // 운동량 조정 layer_weight [l] [j+1] [i]+= layer_weight_delta [l] [j+1] [i]; // 가중치 조정}} layererr [l] [j] = z*layer [l] [j]*(1 Layer [l] [J]); // record error}}} public void train (double []) 컴퓨터 아웃 (in); updateweight (tar); }}신경망 사용의 예
마지막으로, 신경망의 마법 효과를 볼 수있는 간단한 예를 찾아 봅시다. 데이터 분포의 관찰을 용이하게하기 위해 2 차원 좌표 데이터를 선택합니다. 아래에는 4 개의 데이터가 있습니다. 블록은 데이터 유형을 나타내고 삼각형은 데이터 유형을 나타냅니다. 블록 유형에 속하는 데이터가 (1, 2) 및 (2, 1)이고 삼각형 유형에 속하는 데이터는 (1, 1), (2, 2)임을 알 수 있습니다. 이제 문제는 4 개의 데이터를 평면에서 1과 0으로 나누고 새로운 데이터의 유형을 예측하는 데 사용해야한다는 것입니다.
로지스틱 회귀 알고리즘을 사용하여 위의 분류 문제를 해결할 수 있지만 로지스틱 회귀는 분할 선으로 선형 직선을 얻습니다. 위의 빨간색 선이 어떻게 배치하든 샘플은 항상 다른 유형으로 잘못 분류된다는 것을 알 수 있습니다. 따라서 위의 데이터의 경우 하나의 직선만이 분류를 올바르게 나눌 수 없습니다. 신경망 알고리즘을 사용하는 경우 아래 그림의 분류 효과를 얻을 수 있습니다.이 그림의 분류 효과는 공간을 나누기 위해 여러 직선의 결합을 찾는 것과 같습니다. 이는 정확도가 높습니다.
다음은이 테스트 프로그램의 소스 코드 BPDEEPTEST.java입니다.
import java.util.arrays; public class bpdeeptest {public static void main (string [] args) {// 신경망의 기본 구성을 초기화 // 첫 번째 매개 변수는 신경망의 계층 수와 레이어 당 노드 수를 나타내는 정수 배열입니다. 예를 들어, {3, 10, 10, 10, 10, 2}는 입력 레이어가 3 개의 노드이고, 출력 레이어는 2 개의 노드이고, 중간에 4 개의 숨겨진 레이어가 있고, 레이어 당 10 개의 노드가 있음을 의미합니다. 0.8); // 위의 4 차원 좌표 데이터에 해당하는 샘플 데이터를 설정합니다 [] [] [] data = new Double [] [] {{1,2}, {2,2}, {1,1}, {2,1}}; // 4 좌표 데이터의 분류에 해당하는 대상 데이터를 설정합니다 [] [] target = new Double [] [] {{1,0}, {0,1}, {0,1}, {1,0}}; // (int n = 0; n <5000; n ++)에 대해 5000 회 반복 훈련 (int i = 0; i <data.length; i ++) bp.train (data [i], target [i]); // (int j = 0; j <data.length; j ++) {double [] result = bp.computeout (data [j]); System.out.println (arrays.tostring (data [j])+":"+arrays.tostring (result)); } // 교육 결과를 기반으로 새 데이터의 분류를 예측합니다 [] x = new Double [] {3,1}; double [] result = bp.computeout (x); System.out.println (arrays.tostring (x)+":"+arrays.tostring (결과)); }} 요약
위의 시험 프로그램은 신경망이 마법의 분류 효과를 가지고 있음을 보여줍니다. 실제로, 신경망에는 특정 장점이 있지만 인간 뇌에 가까운 보편적 인 알고리즘은 아닙니다. 여러 번 우리를 실망시킬 수 있습니다. 또한 다양한 시나리오의 많은 데이터를 사용하여 그 효과를 관찰해야합니다. 1 층 숨겨진 계층을 N- 레이어로 변경하고 레이어 당 노드, 반복, 학습 단계 크기 및 모멘텀 계수의 수를 조정하여 최적화 된 결과를 얻을 수 있습니다. 그러나, 많은 경우에, N- 레이어 숨겨진 층의 효과는 계층 1의 효과보다 크게 개선되지 않았다. 대신, 계산은 더 복잡하고 시간이 많이 걸린다. 신경망에 대한 우리의 이해에는 더 많은 연습과 경험이 필요합니다.
위의 것은 70 줄의 Java 코드로 깊은 신경 네트워크 알고리즘을 구현하는 것에 대한이 기사에서 공유되는 모든 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 단점이 있으면 메시지를 남겨 두십시오.