AI Basic

심층 신경망: 33년 전과 지금 33년(by Andrej Karpathy)

wandering developer 2023. 9. 3. 02:41

딥러닝에대해서 잘 모르는가?

 

초보자인가?

 

이 글을 읽고 소스코드를 이해해보자!

 

상당한 도움이 된다.

 

즉 상당히 좋은 글이다.

 

특히 초보자인 나한테는 Karpathy의 코드 스타일을 볼 수 있어서 너무 좋았다.

 

아래 글을 읽으면 여러가지를 읽힐 수 있다.

 

1. Augmentation - 데이터 증폭

if self.training
	# 래덤하게 -1,0,1을 얻는다
	shift_x, shift_y = np.random.randint(-1, 2, size=2)
	# 랜덤하게 얻은 -1,0,1중 한 값을 dim 2,3 즉 height, width방햐으로 shift시킨다
	x = torch.roll(x, (shift_x, shift_y), (2, 3))

 2. dropout이 어떻게 사용되는지 알 수 있습니다.

x = F.dropout(x, p=0.25, training=self.training)

3. 2D convolution에대해서 제대로 이해할 수 있다.


코드 저장소.

 

https://github.com/karpathy/lecun1989-repro/

 

GitHub - karpathy/lecun1989-repro: Reproducing Yann LeCun 1989 paper "Backpropagation Applied to Handwritten Zip Code Recognitio

Reproducing Yann LeCun 1989 paper "Backpropagation Applied to Handwritten Zip Code Recognition", to my knowledge the earliest real-world application of a neural net trained with backpropa...

github.com

 

블로글 출처

https://karpathy.github.io/2022/03/14/lecun1989/


나 같은 초보자에게 정말 좋은 예제이다.....

 

내가 생각하기에 중요하다고 생각되는 부분은 적어본다.

 

아이디어는 33년 전에 나온 논문을 구현해서 재현 해보고 지금 현대 기술을 접목해서 어디까지 성능이 향상될 수 있는지 확인해보는 예이다.

 

33년 전 논문 구현 부분은

$ python repro.py

으로 실행 할 수 있음.

 

eval: split train. loss 4.073383e-03. error 0.62%. misses: 45
eval: split test . loss 2.838382e-02. error 4.09%. misses: 82

실행하면 아래와 같은 결과가 나옴을 기억하자.

 

실행시간 :  약 90초

에러확률 : 4.09%

를 기억하자!

 

코드를 보면 

loss = torch.mean((y - yhat)**2)

-->

loss = F.cross_entropy(yhat, y.argmax(dim=1))

cross 엔트로피 함수로 변경되었다.

eval: split train. loss 9.536698e-06. error 0.00%. misses: 0
eval: split test . loss 9.536698e-06. error 4.38%. misses: 87

 

그 다음 Optimizer를 변경해봅니다.

~~~

출력 레이어에 (포화) tanh 비선형성이 있고 그 위에 MSE 오류가 있는 경우 가중치 초기화 세부 사항에 훨씬 더 주의해야 한다고 생각합니다. 다음으로, 내 경험상 매우 세밀하게 조정된 SGD는 매우 잘 작동할 수 있지만 최신 Adam 최적화 프로그램 (물론 3e-4의 학습률 :))은 거의 항상 강력한 기준이며 조정이 거의 또는 전혀 필요하지 않습니다. 따라서 최적화가 성능을 방해하지 않는다는 자신감을 높이기 위해 LR 3e-4를 사용하는 AdamW로 전환하고 훈련 과정에서 이를 1e-4로 줄여 다음을 제공합니다.

~~~

optimizer = optim.SGD(model.parameters(), lr=args.learning_rate)
-->
optimizer = optim.AdamW(model.parameters(), lr=args.learning_rate)

아래와 같이 과적합은 해결되지 않았지만 에러율은 향상된것을 확인 할 수 있습니다.

eval: split train. loss 0.000000e+00. error 0.00%. misses: 0
eval: split test . loss 0.000000e+00. error 3.59%. misses: 72

이는 SGD보다 약간 향상된 결과를 제공했습니다. 단, 과적합 상황을 해결하는 데 도움이 되는 기본 매개변수를 통해 라이딩에 약간의 무게 감소가 발생했다는 점도 기억해야 합니다. 여전히 과적합이 심하므로 다음으로 입력 이미지를 수평 또는 수직으로 최대 1픽셀까지 이동하는 간단한 데이터 증대 전략을 도입했습니다. 그러나 이는 데이터세트 크기 증가를 시뮬레이션하기 때문에 패스 수도 23개에서 60개로 늘려야 했습니다(원래 설정에서 순진하게 패스를 늘리는 것만으로는 결과가 크게 향상되지 않음을 확인했습니다).

eval: split train. loss 8.780676e-04. error 1.70%. misses: 123
eval: split test . loss 8.780676e-04. error 2.19%. misses: 43

테스트 오류에서 볼 수 있듯이, 꽤 많은 도움이 되었습니다! 데이터 증대는 과적합을 방지하는 데 사용되는 매우 간단하고 표준적인 개념이지만 1989년 논문에서는 언급되지 않았습니다. 아마도 최근의 혁신(?)이었을 것입니다. 여전히 약간의 과적합이 진행 중이기 때문에 도구 상자에서 또 다른 최신 도구인 Dropout을 선택했습니다 . 매개변수 수가 가장 많은 레이어(H3) 바로 앞에 0.25의 약한 드롭아웃을 추가했습니다. 드롭아웃은 활성화를 0으로 설정하기 때문에 활성 범위가 [-1,1]인 tanh와 함께 사용하는 것은 그다지 의미가 없으므로 모든 비선형성도 훨씬 간단한 ReLU 활성화 함수로 교체 했습니다 . 드롭아웃은 훈련 중에 더 많은 소음을 발생시키기 때문에 최대 80번의 패스까지 더 오랫동안 훈련해야 하지만 다음을 제공합니다.

eval: split train. loss 2.601336e-03. error 1.47%. misses: 106
eval: split test . loss 2.601336e-03. error 1.59%. misses: 32

테스트 세트에서 2007년 기준 실수는 32개에 불과합니다! 원래 네트워크에서 tanh -> relu를 바꾸는 것만으로는 실질적인 이득을 얻을 수 없다는 것을 확인했습니다. 따라서 여기서 개선된 대부분은 드롭아웃을 추가한 것입니다. 요약하자면, 1989년으로 시간 여행을 간다면 오류율을 약 60% 정도 줄일 수 있어 실수가 ~80에서 ~30으로 줄어들고 테스트 세트의 전체 오류율은 ~1.5%가 됩니다. 훈련 시간을 거의 4배로 늘렸기 때문에 이러한 이득이 완전히 무료로 제공되지는 않았으며, 이로 인해 1989년 훈련 시간이 3일에서 거의 12일로 늘어났습니다. 그러나 추론 지연 시간은 영향을 받지 않았습니다. 나머지 오류는 다음과 같습니다.

 

데이터 량을 늘려서 분석 해보면.....

그러나 MSE -> Softmax, SGD -> AdamW를 교체하고 데이터 증대, 드롭아웃을 추가하고 tanh -> relu를 교체한 후 아이디어의 열매가 점점 줄어들기 시작했습니다. 몇 가지 추가 작업(예: 체중 정규화)을 시도했지만 실질적으로 더 나은 결과를 얻지 못했습니다. ViT(Visual Transformer) 도 소형화하려고 노력했습니다.)를 매개변수 및 플롭의 수와 대략 일치하지만 컨브넷의 성능과 일치할 수 없는 "micro-ViT"로 변환합니다. 물론 지난 33년 동안 다른 많은 혁신이 이루어졌지만 그 중 많은 혁신(예: 잔여 연결, 레이어/배치 정규화)은 훨씬 더 큰 모델에서만 관련이 있으며 대부분 대규모 최적화를 안정화하는 데 도움이 됩니다. 이 시점에서는 네트워크 크기를 확장하여 추가 이점을 얻을 수 있지만, 이로 인해 테스트 시간 추론 지연 시간이 부풀어 오릅니다.

데이터를 이용한 부정 행위 . 성능을 향상시키는 또 다른 접근 방식은 데이터 세트를 확장하는 것이었지만 라벨링 비용은 1달러가 소요됩니다. 다시 한번 참고할 수 있도록 원래 복제 기준은 다음과 같습니다.

eval: split train. loss 4.073383e-03. error 0.62%. misses: 45
eval: split test . loss 2.838382e-02. error 4.09%. misses: 82

모든 MNIST를 사용할 수 있다는 사실을 활용하여 훈련 세트를 ~7배(예제 7,291~50,000개)까지 확장해 볼 수 있습니다. 100회 패스에 대해 기본 훈련을 실행하면 이미 추가된 데이터만으로도 일부 개선이 나타났습니다.

eval: split train. loss 1.305315e-02. error 2.03%. misses: 60
eval: split test . loss 1.943992e-02. error 2.74%. misses: 54

그러나 이를 현대 지식의 혁신(이전 섹션에서 설명)과 결합하면 최고의 성능을 얻을 수 있습니다.

eval: split train. loss 3.238392e-04. error 1.07%. misses: 31
eval: split test . loss 3.238392e-04. error 1.25%. misses: 24

요약하자면, 1989년에 데이터 세트를 확장하는 것만으로도 추론 지연 시간에 대한 비용을 들이지 않고 시스템 성능을 향상시킬 수 있는 효과적인 방법이었을 것입니다.

 

블로그에서 주는 교훈

 

  • 2055 신경망은 더 크다는 점을 제외하면 매크로 수준에서 2022 신경망과 기본적으로 동일합니다.
  • 33년 동안 거시적인 측면에서 별로 변한 것이 없습니다.
  • 워크스테이션에서 훈련하는 데 3일이 걸렸던 최첨단 분류기가 이제 팬이 없는 노트북에서 90초 만에 훈련가능(3,000X 순진한 속도 향상)
  • 데이터 세트를 확장하는 것만으로도 어느 정도의 이득을 얻을 수 있었습니다.
  •  제가 언급하고 싶은 가장 중요한 추세는 일부 대상 작업(예: 숫자 인식)에 대해 처음부터 신경망을 훈련하는 전체 설정이 미세 조정으로 인해, 특히 기초 모델의 출현으로 인해 빠르게 구식화되고 있다는 것입니다 .GPT처럼. 이러한 기초 모델은 상당한 컴퓨팅 리소스를 갖춘 소수의 기관에서만 훈련되며, 대부분의 응용 프로그램은 네트워크 일부의 가벼운 미세 조정, 신속한 엔지니어링 또는 더 작은 특수 목적 추론 네트워크로의 데이터 또는 모델 증류의 선택적 단계를 통해 달성됩니다. 

빠르게 변하는 세상을 이하는것은 힘들다.

 

판단도 힘들다....

 

그러나 이렇게 똑똑한 사람이 블로그 까지 만들면서 설명해주니.... 얼마나 좋은가?

 

결국 데이터와 컴퓨터가 답이다....라는 말처럼 들려서 씁슬하다....

 


번역 글.

심층 신경망: 33년 전과 지금 33년

2022년 3월 14일

Yann LeCun et al. (1989) 필기 우편번호 인식에 적용된 논문 역전파제가 아는 바로는 이것이 역전파를 통해 엔드투엔드 훈련된 신경망을 실제 세계에서 최초로 적용한 것이기 때문에 역사적으로 중요한 의미가 있다고 생각합니다. 작은 데이터세트(7291개의 16x16 회색조 숫자 이미지)와 사용된 작은 신경망(단지 1,000개의 뉴런)을 제외하고 이 논문은 33년이 지난 오늘날 놀랍도록 현대적입니다. 데이터세트를 배치하고 신경망 아키텍처, 손실 함수를 설명합니다. , 최적화 및 훈련 및 테스트 세트에 대한 실험적 분류 오류율을 보고합니다. 33년 전의 것이라는 점을 제외하고는 모두 현대 딥러닝 논문으로 매우 잘 인식되고 유형 확인이 가능합니다. 그래서 저는 1) 재미를 위해 이 논문을 재현하고, 2) 딥러닝 진행의 성격에 대한 사례 연구로 연습을 활용하기로 했습니다.

구현 . 나는 가능한 한 논문을 따라가려고 노력했고 이 karpathy/lecun1989-repro github repo에서 PyTorch의 모든 것을 다시 구현했습니다. 원래 네트워크는 Bottou 및 LeCun 1988 역전파 시뮬레이터 SN을 사용하여 Lisp에서 구현되었습니다.(나중에 Lush로 명명됨). 이 논문은 프랑스어로 되어 있어서 잘 읽을 수 없지만 구문을 보면 오늘날 PyTorch와 같은 작업과 유사한 상위 수준 API를 사용하여 신경망을 지정할 수 있는 것처럼 보입니다. 소프트웨어 설계에 대해 간단히 설명하자면, 최신 라이브러리는 3가지 구성 요소로 분할되는 설계를 채택했습니다. 1) 다차원 텐서에 대한 기본 수학 연산을 구현하는 빠른(C/CUDA) 일반 텐서 라이브러리, 2) 자동 그라데이션 엔진 순방향 컴퓨팅 그래프를 추적하고 역방향 패스에 대한 작업을 생성할 수 있으며 3) 스크립트 가능한(Python) 딥 러닝 인식, 일반적인 딥 러닝 작업, 레이어, 아키텍처, 최적화 프로그램, 손실 함수 등의 고급 API입니다.

훈련 . 훈련 과정 동안 우리는 신경망에 총 167,693개의 (예, 라벨) 프리젠테이션을 위해 7291개의 예제로 구성된 훈련 세트에 대해 23번의 패스를 수행해야 합니다. 원래 네트워크는 SUN-4/260 워크스테이션에서 3일 동안 훈련되었습니다. 저는 MacBook Air(M1) CPU에서 구현을 실행했는데, 약 90초(~ 3000X 순진한 속도 향상 ) 만에 완료되었습니다 . 내 콘다는 Rosetta 에뮬레이션이 아닌 기본 arm64 빌드를 사용하도록 설정되어 있습니다. PyTorch가 M1의 전체 기능(GPU 및 NPU 포함)을 지원했다면 속도 향상은 더욱 극적이었을 것입니다. 하지만 이는 아직 개발 중인 것으로 보입니다. 또한 A100 GPU에서 순진하게 코드를 실행해 보았으나 실제로는 훈련 속도가 더 느렸습니다., 이는 네트워크가 너무 작기 때문에(최대 12개 채널, 총 9760개 매개변수, 64K MAC, 1K 활성화) SGD가 한 번에 하나의 예만 사용하기 때문입니다. 즉, 최신 하드웨어(A100) 및 소프트웨어 인프라(CUDA, PyTorch)로 이 문제를 해결하려면 GPU 활용도를 최대화하고 또 다른 목표를 달성하기 위해 예제별 SGD를 전체 배치 훈련으로 교환해야 합니다. 훈련 대기 시간이 ~100배 빨라졌습니다.

1989년 공연을 재현 . 원본 논문에서는 다음과 같은 결과를 보고합니다.

eval: split train. loss 2.5e-3. error 0.14%. misses: 10
eval: split test . loss 1.8e-2. error 5.00%. misses: 102

현재 형식의 훈련 스크립트 repro.py는 23번째 패스 끝에 인쇄됩니다.

eval: split train. loss 4.073383e-03. error 0.62%. misses: 45
eval: split test . loss 2.838382e-02. error 4.09%. misses: 82

그래서 대략적으로 숫자를 재현하고 있어요, 그러나 정확히는 아닙니다. 안타깝게도 원본 데이터 세트가 시간이 지남에 따라 손실되었기 때문에 정확한 재현이 불가능할 가능성이 높습니다. 대신, 28x28 자리를 취하고 쌍선형 보간법을 사용하여 16x16 픽셀로 축소하고 대체 없이 무작위로 올바른 수의 교육 및 테스트를 그리는 방식으로 더 큰 MNIST 데이터세트(그런 말을 하게 될 줄은 몰랐네요)를 사용하여 시뮬레이션해야 했습니다. 그것에서 예를 설정하십시오. 그러나 나는 다른 범인이 있다고 확신합니다. 예를 들어, 이 논문은 가중치 초기화 체계에 대한 설명이 너무 추상적이어서 PDF 파일에 점 "."을 지워서 "2.5"를 다음과 같이 보이게 하는 형식 오류가 있는 것으로 의심됩니다. "2 5", 그리고 잠재적으로 (제 생각에는?) 제곱근을 지울 수도 있습니다. 예를 들어 가중치 초기화는 F가 팬인인 균일한 "2 4 / F"에서 가져온다고 들었습니다. 하지만 나는 이것이 확실히 (?)가 "2.4 / sqrt(F)"를 의미한다고 생각합니다. 여기서 sqrt는 출력의 표준 편차를 보존하는 데 도움이 됩니다. 네트의 H1과 H2 레이어 사이의 특정 희소 연결 구조도 무시됩니다. 논문에서는 "여기에서 논의되지 않는 구성표에 따라 선택되었습니다"라고만 말하고 있으므로 여기서 몇 가지 합리적인 추측을 해야 했습니다. 중첩된 블록 희소 구조. 이 논문에서는 또한 tanh 비선형성을 사용한다고 주장하지만 이것이 실제로 ntanh(1) = 1을 매핑하는 "정규화된 tanh"일 수도 있고 잠재적으로 당시 유행했던 축소된 건너뛰기 연결이 추가되었을 수도 있다는 걱정이 됩니다. tanh의 평평한 꼬리에 최소한 약간의 기울기가 있는지 확인하는 시간입니다. 마지막으로, 이 논문은 "헤세 행렬의 양의 대각선 근사를 사용하는 뉴턴 알고리즘의 특수 버전"을 사용합니다.

시간여행을 통한 부정행위 . 이 시점에서 내가 가장 좋아하는 부분이 나왔습니다. 우리는 33년 후의 미래에 여기에 살고 있으며 딥러닝은 매우 활발한 연구 분야입니다. 현대적인 이해와 33년간의 R&D를 통해 원래 결과를 얼마나 개선할 수 있습니까? 내 원래 결과는 다음과 같습니다.

eval: split train. loss 4.073383e-03. error 0.62%. misses: 45
eval: split test . loss 2.838382e-02. error 4.09%. misses: 82

제가 간략히 설명했던 첫 번째 사항은 10개의 범주로 간단한 분류를 수행하고 있다는 것입니다. 그러나 당시 이는 목표 -1 (음성 클래스의 경우) 또는 +1( 양성 클래스의 경우), tanh 비선형성도 갖는 출력 뉴런이 있습니다. 그래서 클래스 로짓을 얻기 위해 출력 레이어에서 tanh를 삭제하고 표준(멀티클래스) 교차 엔트로피 손실 함수에서 교체했습니다. 이 변경으로 훈련 오류가 크게 개선되어 훈련 세트가 완전히 과적합되었습니다.

eval: split train. loss 9.536698e-06. error 0.00%. misses: 0
eval: split test . loss 9.536698e-06. error 4.38%. misses: 87

출력 레이어에 (포화) tanh 비선형성이 있고 그 위에 MSE 오류가 있는 경우 가중치 초기화 세부 사항에 훨씬 더 주의해야 한다고 생각합니다. 다음으로, 내 경험상 매우 미세하게 조정된 SGD는 매우 잘 작동할 수 있지만 최신 Adam 최적화 프로그램 (물론 3e-4의 학습률 :))은 거의 항상 강력한 기준이며 조정이 거의 또는 전혀 필요하지 않습니다. 따라서 최적화가 성능을 방해하지 않는다는 확신을 높이기 위해 LR 3e-4를 사용하는 AdamW로 전환하고 훈련 과정에서 이를 1e-4로 줄여 다음을 제공합니다.

eval: split train. loss 0.000000e+00. error 0.00%. misses: 0
eval: split test . loss 0.000000e+00. error 3.59%. misses: 72

이는 SGD보다 약간 향상된 결과를 제공했습니다. 단, 과적합 상황을 해결하는 데 도움이 되는 기본 매개변수를 통해 라이딩에 약간의 무게 감소가 발생했다는 점도 기억해야 합니다. 여전히 과적합이 심하므로 다음으로 입력 이미지를 수평 또는 수직으로 최대 1픽셀까지 이동하는 간단한 데이터 증대 전략을 도입했습니다. 그러나 이는 데이터세트 크기 증가를 시뮬레이션하기 때문에 패스 수도 23개에서 60개로 늘려야 했습니다(원래 설정에서 순진하게 패스를 늘리는 것만으로는 결과가 크게 향상되지 않음을 확인했습니다).

eval: split train. loss 8.780676e-04. error 1.70%. misses: 123
eval: split test . loss 8.780676e-04. error 2.19%. misses: 43

테스트 오류에서 볼 수 있듯이, 꽤 많은 도움이 되었습니다! 데이터 증대는 과적합을 방지하는 데 사용되는 매우 간단하고 표준적인 개념이지만 1989년 논문에서는 언급되지 않았습니다. 아마도 최근의 혁신(?)이었을 것입니다. 여전히 약간의 과적합이 진행 중이기 때문에 도구 상자에서 또 다른 최신 도구인 Dropout을 선택했습니다 . 매개변수 수가 가장 많은 레이어(H3) 바로 앞에 0.25의 약한 드롭아웃을 추가했습니다. 드롭아웃은 활성화를 0으로 설정하기 때문에 활성 범위가 [-1,1]인 tanh와 함께 사용하는 것은 그다지 의미가 없으므로 모든 비선형성을 훨씬 간단한 ReLU 활성화 함수로 교체 했습니다 . 드롭아웃은 훈련 중에 더 많은 소음을 발생시키기 때문에 최대 80번의 패스까지 더 오랫동안 훈련해야 하지만 다음을 제공합니다.

eval: split train. loss 2.601336e-03. error 1.47%. misses: 106
eval: split test . loss 2.601336e-03. error 1.59%. misses: 32

테스트 세트에서 2007년 기준 실수는 32개에 불과합니다! 원래 네트워크에서 tanh -> relu를 바꾸는 것만으로는 실질적인 이득을 얻을 수 없다는 것을 확인했습니다. 따라서 여기에서 대부분의 개선은 드롭아웃 추가에서 비롯됩니다. 요약하자면, 1989년으로 시간 여행을 간다면 오류율을 약 60% 정도 줄일 수 있을 것입니다. 즉, 실수가 ~80에서 ~30으로 줄어들고 테스트 세트의 전체 오류율은 ~1.5%가 됩니다. 훈련 시간을 거의 4배로 늘렸기 때문에 이러한 이득이 완전히 무료로 제공되지는 않았으며, 이로 인해 1989년 훈련 시간이 3일에서 거의 12일로 늘어났습니다. 그러나 추론 지연 시간은 영향을 받지 않았습니다. 나머지 오류는 다음과 같습니다.

심도 학습 . 그러나 MSE -> Softmax, SGD -> AdamW를 교체하고 데이터 증대, 드롭아웃을 추가하고 tanh -> relu를 교체한 후 아이디어의 열매가 점점 줄어들기 시작했습니다. 몇 가지 추가 작업(예: 체중 정규화)을 시도했지만 실질적으로 더 나은 결과를 얻지 못했습니다. ViT(Visual Transformer) 도 소형화하려고 노력했습니다.)를 매개변수 및 플롭의 수와 대략 일치하지만 컨브넷의 성능과 일치할 수 없는 "micro-ViT"로 변환합니다. 물론 지난 33년 동안 다른 많은 혁신이 이루어졌지만 그 중 많은 혁신(예: 잔여 연결, 레이어/배치 정규화)은 훨씬 더 큰 모델에서만 관련이 있으며 대부분 대규모 최적화를 안정화하는 데 도움이 됩니다. 이 시점에서는 네트워크 크기를 확장하여 추가 이점을 얻을 수 있지만, 이로 인해 테스트 시간 추론 지연 시간이 부풀어 오릅니다.

데이터를 이용한 부정 행위 . 성능을 향상시키는 또 다른 접근 방식은 데이터 세트를 확장하는 것이었지만 라벨링 비용은 1달러가 소요됩니다. 다시 한번 참고할 수 있도록 원래 복제 기준은 다음과 같습니다.

eval: split train. loss 4.073383e-03. error 0.62%. misses: 45
eval: split test . loss 2.838382e-02. error 4.09%. misses: 82

모든 MNIST를 사용할 수 있다는 사실을 활용하여 훈련 세트를 ~7배(예제 7,291~50,000개)까지 확장해 볼 수 있습니다. 100회 패스에 대해 기본 훈련을 실행하면 이미 추가된 데이터만으로도 일부 개선이 나타났습니다.

eval: split train. loss 1.305315e-02. error 2.03%. misses: 60
eval: split test . loss 1.943992e-02. error 2.74%. misses: 54

그러나 이를 현대 지식의 혁신(이전 섹션에서 설명)과 결합하면 최고의 성능을 얻을 수 있습니다.

eval: split train. loss 3.238392e-04. error 1.07%. misses: 31
eval: split test . loss 3.238392e-04. error 1.25%. misses: 24

요약하자면, 1989년에 데이터 세트를 확장하는 것만으로도 추론 지연 시간에 대한 비용을 들이지 않고 시스템 성능을 향상시킬 수 있는 효과적인 방법이었을 것입니다.

영향분석 . 1989년 최첨단 딥 러닝 기술을 검토하는 2022년 시간 여행자로서 우리가 배운 내용을 요약해 보겠습니다.

  • 우선, 33년 동안 거시적인 측면에서 별로 변한 것이 없습니다. 우리는 여전히 뉴런 층으로 구성된 미분 가능한 신경망 아키텍처를 설정하고 역전파 및 확률적 경사하강법을 통해 엔드투엔드를 최적화하는 중입니다. 크기가 더 작다는 점을 제외하면 모든 것이 매우 친숙하게 읽혀집니다.
  • 데이터세트는 오늘날의 기준으로 볼 때 아주 어린 수준입니다. 훈련 세트는 7291개의 16x16 회색조 이미지에 불과합니다. 오늘날의 비전 데이터 세트에는 일반적으로 웹에서 가져온 수억 개의 고해상도 컬러 이미지가 포함되어 있지만(예: Google은 JFT-300M을 보유하고 있으며 OpenAI CLIP은 400M에서 교육을 받았습니다) 그 규모는 수십억 개에 이릅니다. 이것은 대략입니다. 이미지당 최대 1000X 픽셀 정보(384*384*3/(16*16))에 이미지 수(1e9/1e4)의 100,000X를 곱하여 입력 시 대략 100,000,000X 더 많은 픽셀 데이터를 얻을 수 있습니다.
  • 신경망도 초기 상태입니다. 이 1989년 신경망에는 대략 9760개 매개변수, 64K MAC 및 1K 활성화. 최신(비전) 신경망은 수십억 개의 작은 매개변수(1,000,000X) 및 O(~1e12) MAC(~10,000,000X) 규모입니다. 자연어 모델은 수조 개의 매개변수에 도달할 수 있습니다.
  • 워크스테이션에서 훈련하는 데 3일이 걸렸던 최첨단 분류기가 이제 팬이 없는 노트북에서 90초 만에 훈련하고(3,000X 순진한 속도 향상), 전체 배치 최적화로 전환하고 GPU.
  • 실제로 저는 현대 R&D 혁신을 기반으로 모델, 증강, 손실 함수 및 최적화를 조정하여 오류율을 60% 줄이면서 데이터 세트와 모델의 테스트 시간 대기 시간을 변경하지 않고 유지할 수 있었습니다.
  • 데이터 세트를 확장하는 것만으로도 어느 정도의 이득을 얻을 수 있었습니다.
  • 더욱 큰 이득은 더 큰 모델에서 나와야 할 가능성이 크며, 이를 위해서는 더 많은 계산이 필요하고, 더 큰 규모로 훈련을 안정화하는 데 도움이 되는 추가 R&D가 필요합니다. 특히, 만약 제가 1989년으로 이동했다면, 더 큰 컴퓨터 없이는 시스템을 더욱 개선할 수 있는 능력이 궁극적으로 한계에 도달했을 것입니다.

이 연습의 교훈이 시간에 따라 변하지 않는다고 가정합니다. 이는 2022년 딥러닝에 대해 무엇을 의미합니까? 2055년에서 온 시간 여행자는 현재 네트워크의 성능에 대해 어떻게 생각할까요?

  • 2055 신경망은 더 크다는 점을 제외하면 매크로 수준에서 2022 신경망과 기본적으로 동일합니다.
  • 오늘날 우리의 데이터 세트와 모델은 농담처럼 보입니다. 둘 다 약 10,000,000X 정도 더 큽니다.
  • 주말 재미있는 프로젝트로 개인용 컴퓨팅 장치에서 순진하게 훈련함으로써 2022년 최신 모델을 1분 안에 훈련할 수 있습니다.
  • 오늘날의 모델은 최적으로 공식화되지 않았으며 모델의 세부 사항, 손실 함수, 확대 또는 최적화 프로그램 중 일부를 변경하는 것만으로도 오류를 절반으로 줄일 수 있습니다.
  • 우리의 데이터 세트는 너무 작으며 데이터 세트만 확장하면 약간의 이익을 얻을 수 있습니다.
  • 컴퓨팅 인프라를 확장하고 해당 규모의 모델을 효과적으로 교육하기 위한 일부 R&D에 투자하지 않으면 실제로 더 많은 이점을 얻을 수 없습니다.

그러나 제가 언급하고 싶은 가장 중요한 추세는 일부 대상 작업(예: 숫자 인식)에 대해 처음부터 신경망을 훈련하는 전체 설정이 미세 조정으로 인해, 특히 기초 모델의 출현으로 인해 빠르게 구식화되고 있다는 것입니다 .GPT처럼. 이러한 기초 모델은 상당한 컴퓨팅 리소스를 갖춘 소수의 기관에서만 훈련되며, 대부분의 응용 프로그램은 네트워크 일부의 가벼운 미세 조정, 신속한 엔지니어링 또는 더 작은 특수 목적 추론 네트워크로의 데이터 또는 모델 증류의 선택적 단계를 통해 달성됩니다. 저는 이러한 추세가 매우 활발하고 실제로 더욱 심화될 것으로 예상해야 한다고 생각합니다. 가장 극단적인 추정에서는 신경망을 전혀 훈련시키고 싶지 않을 것입니다. 2055년에는 10,000,000X 크기의 신경망 메가브레인에게 영어로 말(또는 생각)하여 어떤 작업을 수행하도록 요청할 것입니다. 그리고 당신이 충분히 정중하게 요청한다면, 그것은 의무를 다할 것입니다. 네, 신경망도 훈련할 수 있습니다… 그런데 왜 그럴까요?

반응형