이 글은 안드레이 카패시의 글 소프트웨어 2.0 을 번역한 것입니다. 의/오역이 있을 수 있습니다.
나는 때때로 사람들이 뉴럴넷을 "기계학습 도구 상자의 또 다른 도구"로 언급하는 것을 본다. 뉴럴넷은 장단점이 있다. 여기 저기에서 동작하고, 때로는 캐글 경쟁에서 승리하는데 사용할 수도 있다. 그러나 이 해석은 완전히 나무만 보고 숲을 보지 못하는 것이다. 뉴럴넷은 단지 또 다른 종류의 분류기가 아니다. 그것은 우리가 소프트웨어를 작성하는데 있어 근본적인 변화의 시작을 나타낸다. 그것은 소프트웨어 2.0이다.
소프트웨어 1.0의 "고전적인 스택"은 우리가 익숙한 것이다. 그것은 Python, C++ 등의 언어로 작성이 되어 있고, 프로그래머가 작성한 구체적 명령으로 구성되어 있다. 프로그래머는 코드의 각 라인을 작성하는 것으로 프로그램 공간의 특정 포인트를 어떤 원하는 행동으로 확정짓고 있다.
대조적으로, 소프트웨어 2.0은 뉴럴넷의 가중치를 통해 작성된다. 아주 많은 가중치(일반적인 네트워크가 수백만을 가진다)가 있고, 손으로 가중치를 입력하는 것은 꽤나 어렵기에(내가 해봤다) 이 코드 작성 과정에 사람은 개입하지 않는다. 대신, 바람직한 프로그램에 대한 제약들을 명시(예: 입/출력 쌍의 데이터 셋)하고 프로그램 공간에서 제약을 만족하는 프로그램을 찾기 위해 컴퓨팅 리소스를 활용한다. 뉴럴넷의 경우, 검색 프로세스가 역전파와 SGD(확률적 경사 하강법)를 통해 효율적으로 달성될 수 있도록 프로그램 공간의 연속적인 하위 공간으로 검색을 제한한다.
실세계 문제들 중 많은 것들이 명시적으로 프로그램을 짜기보다는 데이터를 모으는 것이 훨씬 더 쉬운 속성을 가지고 있다는 것이 밝혀졌다. 미래의 프로그래머들 중 많은 이들은 복잡한 소프트웨어 저장소 관리, 뒤얽힌 프로그램 작성, 또는 실행시간 분석같은 작업을 하지 않을 것이다. 그들은 뉴럴넷에 공급할 데이터를 수집, 정리, 조작, 라벨링하고 분석 및 시각화하는 일을 할 것이다.
소프트웨어 2.0은 1.0을 완전히 대체하지는 않을 것이나(실제로 많은 양의 1.0 인프라가 2.0 코드를 학습하고 "컴파일"을 위한 추론에 필요하다), 현재 소프트웨어 1.0이 책임지는 많은 부분들을 장악할 것이다. 이것을 명확히 하기위해 요즘 진행중인 몇 가지 변화의 예를 살펴보자:
예전의 시각 인식 테스크는 일부 머신러닝이 가미된 엔지니어링된 피쳐들로 구성되었었다.(예: SVM) 그후 우리는 훨씬 더 강력한 이미지 분석 프로그램의 구성(ConvNet 계열 아키텍쳐)를 개발하였고, 최근에는 아키텍쳐들에 대한 서치를 시작했다.
음성 인식은 가우시안 믹스쳐 그리고 히든 마르코프 모델 같은 수 많은 전처리를 수반하였으나, 현재는 거의 모두 뉴럴넷으로 구성되어 있다.
음성 합성은 역사적으로 다양한 꿰어 맞추기 구조로 접근하였으나, 현재 가장 강력한 모델은 날 음성 신호를 출력하는 큰 ConvNet (예: WaveNet)이다.
기계 번역은 관용구 기반의 통계적 테크닉으로 접근했었으나, 뉴럴넷이 빠르게 주도하고 있다. 내가 선호하는 아키텍쳐는 단일 모델이 임의의 원천 언어에서 대상 언어로 번역을 하는 다중 언어, 그리고 약한 지도학습(또는 완전한 자율학습)의 셋팅이다.
로봇 공학은 명시적 표현과 중간 수준 표현에 대한 알고리즘을 사용하여 문제를 감지, 자세 예측, 계획, 컨트롤, 불확실성 모델링 등의 큰 블럭으로 쪼개는 오랜 전통을 가졌다. 이 분야에서 아직 충분히 성취하지는 못했지만, UC 버클리와 구글의 연구는 소프트웨어 2.0이 이런 코드들을 표현하는데 보다 더 잘 할 것이라는 힌트를 주고 있다.
바둑을 플레이하는 프로그램은 오랫동안 있어 왔지만, AlphaGo Zero(보드의 날 상태를 보고 동작을 결정하는 ConvNet)는 이 게임에서 가장 강력한 플레이어가 되었다. 비슷한 결과를 DOTA 2나 스타크래프트에서도 볼 것으로 나는 예상한다.
당신은 위의 많은 항목들이 구글의 작업과 연관되어 있다는 것을 발견할 것이다. 그것은 구글이 그 자신의 많은 부분들을 소프트웨어 2.0 코드로 재작성하는 데 선두에 있기 때문이다. "모든 것을 다룰 수 있는 하나의 모델"은 이것이 어떤 모습이 될지에 대한 초기 스케치를 보여주는데, 그것은 개별 도메인의 통계적 강점이 세계에 대한 하나의 일관적 이해로 통합되는 것이다.
왜 우리는 복잡한 프로그램을 소프트웨어 2.0에 이식하는 것을 선호해야 할까? 확실히 쉬운 대답은 그것이 실제로 더 잘 작동한다는 것이다. 그러나 이 스택을 선호하는 데는 다른 많은 이유가 있다. 소프트웨어 2.0(ConvNet을 가정)이 소프트웨어 1.0(프로덕션 수준의 C++ 코드 기반을 가정)과 비교했을 때 소프트웨어 2.0이 가지는 몇 가지 이점을 살펴 보자:
일반적인 신경망은 첫 번째로 행렬 곱셈과 0 임계값(ReLU)의 두 가지 연산만으로 구성된다. 이것을 훨씬 더 이질적이고 복잡한 고전적 소프트웨어의 명령 세트와 비교해 보라. 소수의 핵심 계산 요소(예 : 행렬 곱하기)에 대해서만 소프트웨어 1.0 구현을 제공하면 되기에, 다양한 정확성 / 성능 보장을 훨씬 쉽게 할 수 있다.
필연적으로, 신경 네트워크의 명령 세트가 비교적 작기 때문에, 이들 네트워크를 실리콘에 더 가깝게 구현하는 것이 훨씬 용이하다. 커스텀 ASICs, 유사 신경 칩 등이 있는데, 저전력 인텔리전스가 우리 주변에 퍼지면 세상이 바뀔 것이다. 예를 들어 사전 학습된 ConvNet, 음성 인식기 및 WaveNet 음성 합성 네트워크 등이 하나의 작고 저렴한 칩에 통합되어 모든 장치에 붙여질 수 있다.
일반적인 신경 네트 순방향 전달의 모든 순회에는 정확히 같은 양의 FLOPS가 필요하다. 거대한 C++ 코드 베이스를 거치면서 수행 할 수 있는 여러 실행 경로에 따른 가변성이 없다. 물론 동적 계산 그래프를 가질 수도 있지만, 실행 흐름은 일반적으로 상당히 제한된다. 이것은 의도하지 않은 무한 루프에 거의 빠지지 않도록 보장한다.
위와 관련하여 동적으로 할당 된 메모리가 없으므로 디스크로 스와핑 될 가능성이 적어지거나 코드에서 찾아내야 하는 메모리 누수가 생길 가능성이 거의 없다.
행렬 곱셈의 시퀀스는 고전적인 바이너리 또는 스크립트에 비해 임의의 컴퓨팅 환성에서 실행하는 것이 훨씬 쉽다.
C++ 코드가 있고 누군가가 필요할 때 성능을 두 배로 향상 시키길 원한다면(필요하다면 정확도를 희생해서) 시스템을 새로운 사양으로 조정하는 것이 쉽지 않을 수 있다. 그러나 소프트웨어 2.0에서는 네트워크를 가져와 채널의 절반을 제거하고 재학습 시키면, 바로 정확히 두배로 그리고 좀 덜 정확하게 동작한다. 그것은 마술과 같다. 반대로 더 많은 데이터를 얻거나 계산을 수행한다면, 더 많은 채널을 추가하고 재학습하는 것만으로 프로그램이 더 잘 작동하게 만들 수 있다.
우리의 소프트웨어는 종종 공용 함수, API 또는 엔드 포인트를 통해 통신하는 모듈들로 나누어진다. 별도로 학습된 두 개의 소프트웨어 2.0 모듈이 상호작용하는 경우, 그것들을 하나로 연결하여 쉽게 역전파 할 수 있다. 웹 브라우저가 로레벨의 시스템 명령어 10 스택을 자동으로 재설계하여 웹 페이지 로딩 효율을 높일 수 있다면 얼마나 놀라운가. 2.0에서는 이것이 기본적인 동작이다.
나는 '딥러닝은 얄팍하다'라는 농담을 좋아한다. 이것은 당신이 유용한 무언가를 얻기 위해 박사 학위가 필요하지 않다는 것이다. 기본 개념은 기초 선형 대수, 미적분, 파이썬 및 CS231n의 일부 강의 정도이다. 물론 오랜 경험에서 얻을 수 있는 전문 지식과 직관력의 양은 아주 많다. 보다 정확한 말은 소프트웨어 2.0 스택은 쉽게 이용할 수 있지만, 쉽게 마스터 할 수는 없다는 것이리라.
마지막으로, 그리고 가장 중요하게, 뉴럴 네트워크는 나나 당신이 현재 가치있는 업종의 상당 부분에서 만들 수 있는 것보다 더 훌륭한 코드라는 것이다. 그것은 현재의 이미지 / 비디오, 음성 / 담화와 별로 관련이 없다.
2.0 스택에는 또한 몇 가지 단점이 있다. 최적화 작업이 끝나면 잘 작동하는 큰 네트워크가 남아 있지만 어떻게 동작하는지는 알려주지 않는다. 많은 응용 분야에서 우리는 이해할 수 있는 90% 정확한 모델 또는 이해할 수 없는 99% 정확한 모델 중에서 선택해야 할 것이다.
2.0 스택은 비직관적이고 난처한 방식으로 실패하거나, 더 나쁘게도 "조용한 실패"를 할 수도 있다. 예를 들어 대부분의 경우 사이즈가 수백만 단위인 학습 데이터에서 적절한 분석 및 검사가 어려운 편향을 조용히 취할 수 있다.
마지막으로, 우리는 아직도 이 스택의 기묘한 특성들을 발견하고 있다. 예를 들어, 적대적인 예와 공격의 존재는 이 스택의 직관적이지 않은 특성을 잘 보여준다.
신경망을 꽤 좋은 분류기가 아닌 소프트웨어 스택으로 간주하면, 소프트웨어를 완전히 변화시키는 데 많은 이점과 잠재력을 가지고 있다는 것이 곧 명확해진다. 장기적으로, 소프트웨어 2.0의 미래는 밝다. 왜냐하면 AGI(Artificial General Intelligence, 인공 일반 지능)를 개발할 때 소프트웨어 2.0으로 작성 될 것이라는 사실이 점차 분명해지고 있기 때문이다. 그렇다면 소프트웨어 3.0은 어떤가? 그것은 전적으로 AGI에 달려있다.
좋은 글 감사합니다. ^^