뇌는 신경망에 비유할 수 있습니다. 이것은 일반적으로 주제를 처음 접하는 사람이 기계 학습 및 인공 신경망 이면의 아이디어를 이해하도록 돕는 데 사용되는 비유입니다.
무대 뒤에서 진행되는 수학적 및 통계적 계산의 여러 계층이 있기 때문에 이러한 네트워크를 수학적 함수로 정의하는 것이 더 발전된 방법입니다.
이것은 실제로 기계 학습에 관심이 있고 Python 신경망 코드가 어떻게 작성되는지 보고 싶은 사람들을 위한 것입니다.
이 기사에서는 완전히 연결된 DNN(심층 신경망)을 처음부터 구성하는 방법을 보여줍니다. Python 3.
Python 신경망 코드의 파일 구조 개요
여기에 XNUMX개의 파일이 생성됩니다. 첫 번째는 "도우미 기능 설정" 및 "처음부터 신경망 만들기"에서 설명할 간단한 nn.py 파일입니다.
"MNIST 데이터 로드"에 설명된 대로 테스트 데이터를 로드하기 위해 mnist loader.py라는 파일도 있습니다.
마지막으로, 우리의 신경망을 테스트하기 위해 터미널에서 실행될 test.py라는 파일이 있을 것입니다.
이 파일은 "테스트 실행"에 자세히 설명되어 있습니다.
설치
이 튜토리얼을 따르려면 NumPy Python 라이브러리를 다운로드해야 합니다. 터미널에서 다음 명령을 사용하여 이를 수행할 수 있습니다.
모듈 가져오기 및 도우미 기능 설정
필요한 라이브러리는 random과 NumPy뿐이며 즉시 가져올 것입니다. 신경망의 초기 가중치에 대해 무작위 라이브러리를 사용하여 섞을 것입니다.
계산 속도를 높이기 위해 NumPy 또는 np를 사용합니다(관례상 종종 np로 가져옴). 두 개의 도우미 함수는 가져오기 후에 만들어집니다. 두 개의 시그모이드 함수: 하나와 시그모이드 소수.
로지스틱 회귀는 시그모이드 함수를 사용하여 데이터를 분류하는 반면 역전파는 시그모이드 프라임 함수를 사용하여 델타 또는 기울기를 계산합니다.
네트워크 클래스 생성
완전히 연결된 신경망을 구축하는 것이 이 섹션의 유일한 초점입니다. 네트워크 클래스는 뒤에 오는 모든 기능을 포함합니다. 함수 Object() { [네이티브 코드] }는 처음에 네트워크 클래스에서 생성됩니다.
하나의 인수인 크기는 Object() { [네이티브 코드] } 함수에 필요합니다. 크기 변수는 신경망의 각 계층에 있는 입력 노드의 수를 나타내는 숫자 값 모음입니다.
__init__ 메서드에서 XNUMX개의 속성을 초기화합니다. 입력 변수 크기는 레이어 크기 목록과 레이어 수, num 레이어를 각각 설정하는 데 사용됩니다.
첫 번째 단계는 입력 레이어를 따르는 각 레이어에 네트워크의 초기 편향을 무작위로 할당하는 것입니다.
마지막으로, 입력 레이어와 출력 레이어 사이의 각 링크에는 가중치가 무작위로 생성됩니다. Np.Random.Randn()은 컨텍스트에 대한 정규 분포에서 추출한 무작위 샘플을 제공합니다.
피드포워드 기능
신경망에서 정보는 피드포워드 기능에 의해 전달됩니다. 이 함수에는 현재 활성화 벡터를 나타내는 하나의 인수가 필요합니다.
이 함수는 네트워크의 모든 편향과 가중치를 반복하여 각 계층의 활성화를 추정합니다. 주어진 대답은 마지막 레이어의 활성화인 예측입니다.
미니 배치 경사하강법
우리 네트워크 클래스의 핵심은 경사하강법입니다. 이 버전에서는 그래디언트 디센트의 수정된 변형인 미니 배치(확률적) 그래디언트 디센트를 사용합니다.
이는 모델을 업데이트하는 데 소량의 데이터 포인트 배치가 사용됨을 나타냅니다. XNUMX개의 필수 인수와 XNUMX개의 선택적 인수가 이 메소드에 전달됩니다. XNUMX가지 필수 변수는 훈련 데이터 세트, 에포크 수, 미니 배치의 크기, 학습률(eta)입니다.
테스트 데이터는 요청 시 제공됩니다. 이 네트워크를 최종적으로 평가할 때 테스트 데이터를 제공할 것입니다. 이 함수의 샘플 수는 초기에 훈련 데이터가 목록 유형으로 변환되면 목록의 길이로 설정됩니다.
우리는 또한 주어진 데이터를 테스트하는 데 동일한 프로세스를 적용합니다. 이는 목록으로 반환되는 대신 실제로 목록의 zip이기 때문입니다. 나중에 MNIST 데이터 샘플을 로드할 때 이에 대해 자세히 알아보겠습니다.
두 종류의 데이터를 모두 목록으로 제공할 수 있다면 이 유형 변환이 반드시 필수적인 것은 아닙니다.
데이터가 있으면 루프에서 훈련 에포크를 살펴봅니다. 훈련 기간은 신경망 훈련의 한 라운드일 뿐입니다. 미니 배치 목록을 만들기 전에 무작위성을 보장하기 위해 먼저 각 에포크의 데이터를 섞습니다.
아래에서 설명하는 업데이트 미니 배치 기능은 각 미니 배치에 대해 호출됩니다. 테스트 데이터를 사용할 수 있는 경우 테스트 정확도도 반환됩니다.
비용파생 도우미 함수
역전파 코드를 실제로 생성하기 전에 먼저 비용 파생이라는 도우미 함수를 개발해 보겠습니다. 출력 레이어에서 실수를 하면 비용 파생 함수가 이를 보여줍니다.
출력 활성화 배열과 예상 출력 값의 y 좌표라는 두 가지 입력이 필요합니다.
역전파 함수
현재 활성화 벡터인 활성화와 다른 활성화 벡터, 활성화 및 z 벡터인 zs를 모두 염두에 두어야 합니다. 입력 레이어라는 레이어가 먼저 활성화됩니다.
각 편향과 가중치를 설정한 후 반복합니다. 각 루프는 가중치와 활성화의 내적으로 z 벡터를 계산하고, 이를 zs 목록에 추가하고, 활성화를 다시 계산하고, 업데이트된 활성화를 활성화 목록에 추가하는 작업을 포함합니다.
마지막으로 수학입니다. 이전 레이어의 오류에 zs 벡터의 마지막 요소의 시그모이드 소수를 곱한 것과 같은 델타는 역방향 패스를 시작하기 전에 계산됩니다.
nabla b의 마지막 레이어는 델타로 설정되고, nabla w의 마지막 레이어는 델타와 마지막에서 두 번째 활성화 레이어의 내적으로 설정됩니다. .
두 번째 레이어부터 시작하여 마지막 레이어까지 이전과 같이 진행하고 이 마지막 레이어를 완료한 후 프로세스를 반복합니다. 그런 다음 nabla는 튜플로 반환됩니다.
미니 배치 경사하강법 업데이트
이전의 SGD(확률적 경사 하강법) 방법은 미니 배치 업데이트를 통합합니다. SGD에서 활용되지만 backprop도 필요하기 때문에 이 기능을 어디에 둘지 고민했습니다.
결국 이곳에 글을 올리기로 했습니다. 우리의 backprop 함수와 마찬가지로 편향 및 가중치 nabla의 0 벡터를 생성하는 것으로 시작합니다.
두 개의 입력으로 미니 배치와 에타 학습률이 필요합니다. 미니 배치에서는 backprop 함수를 사용하여 각 입력 x 및 출력 y에 대한 각 nabla 배열의 델타를 얻습니다. 그런 다음 nabla 목록이 이러한 델타로 업데이트됩니다.
마지막으로 학습률과 nabla를 사용하여 네트워크의 가중치와 편향을 업데이트합니다. 각 값은 가장 최근 값에서 학습률을 뺀 값으로 업데이트하고 미니 배치 크기를 곱한 다음 nabla 값에 더합니다.
기능 평가
평가 함수는 우리가 작성해야 하는 마지막 함수입니다. 테스트 데이터는 이 기능의 유일한 입력입니다. 이 함수에서는 네트워크의 출력을 예상 결과인 y와만 비교합니다. 입력 x를 앞으로 공급함으로써 네트워크의 출력이 결정됩니다.
완전한 코드
모든 코드를 결합하면 다음과 같이 표시됩니다.
신경망 테스트
MNIST 데이터 로드
XNUMXD덴탈의 MNIST 데이터 .pkl.gz 형식이며 GZIP을 사용하여 열고 피클과 함께 로드합니다. 이 데이터를 훈련, 검증 및 테스트 데이터로 나누어 크기 XNUMX의 튜플로 로드하는 빠른 방법을 작성해 보겠습니다.
데이터를 더 쉽게 관리할 수 있도록 y를 10개 항목 배열로 인코딩하는 또 다른 함수를 작성합니다. 배열은 이미지의 적절한 숫자와 일치하는 0을 제외하고 모두 1입니다.
기본 로드 데이터와 하나의 핫 인코딩 방법을 사용하여 데이터를 읽을 수 있는 형식으로 로드합니다. x 값을 이미지의 784 픽셀과 일치하는 크기 784 목록으로 변환하고 y 값을 단일 핫 인코딩된 벡터 형식으로 변환하는 또 다른 함수가 작성됩니다.
그런 다음 한 인덱스가 다른 인덱스와 일치하도록 x 및 y 값을 결합합니다. 이는 훈련, 검증 및 테스트 데이터 세트에 적용됩니다. 그런 다음 변경된 데이터를 반환합니다.
테스트 실행
테스트를 시작하기 전에 이전에 설정한 신경망(단순 nn)과 MNIST 데이터 세트 로더를 모두 가져올 "mnist loader"라는 새 파일을 만들 것입니다.
이 파일에서 우리가 해야 할 일은 데이터를 가져오고, 입력 계층 크기가 784이고 출력 계층 크기가 10인 네트워크를 구축하고, 훈련 데이터에 대해 네트워크의 SGD 함수를 실행한 다음, 테스트 데이터를 사용하여 테스트하는 것입니다.
입력 레이어 목록의 경우 784와 10 사이의 숫자가 무엇이든 차이가 없음을 명심하십시오. 다른 레이어는 원하는 대로 변경할 수 있습니다. 입력 및 출력 크기만 고정됩니다.
세 개의 레이어가 필요하지 않습니다. XNUMX개, XNUMX개 또는 XNUMX개만 사용할 수도 있습니다. 재미있게 실험해 보세요.
결론
여기에서 Python 3을 사용하여 신경망을 처음부터 만듭니다. 높은 수준의 수학과 함께 구현의 세부 사항에 대해서도 논의했습니다.
우리는 도우미 기능을 구현하는 것으로 시작했습니다. 뉴런이 작동하려면 시그모이드 및 시그모이드 프라임 함수가 중요합니다. 그런 다음 신경망에 데이터를 공급하는 기본 프로세스인 피드포워드 기능을 실행합니다.
다음으로 신경망을 구동하는 엔진인 Python에서 경사 하강 함수를 만들었습니다. "로컬 최소값"을 찾고 가중치와 편향을 최적화하기 위해 신경망은 경사 하강법을 사용합니다. 다음을 사용하여 역전파 함수를 만들었습니다. 그라데이션 하강.
출력이 적절한 레이블과 일치하지 않을 때 업데이트를 제공함으로써 이 기능은 신경망이 "학습"할 수 있도록 합니다.
마지막으로 새로운 Python을 신경망 MNIST 데이터 세트를 사용하여 테스트합니다. 모든 것이 원활하게 작동했습니다.
행복한 코딩!
댓글을 남겨주세요.