
소프트웨어 2.0이란 무엇인가? - OpenAI 창립팀 구성원의 설명
저자: Andrej Karpathy (OpenAI 창립 팀 멤버, 전 테슬라 AI 부서 책임자)
번역: OneFlow 커뮤니티, ywh1bkansf
Andrej Karpathy는 왜 AI 물결이 진정으로 중요한지를 가장 먼저 명확히 설명한 인물 중 한 명이다. 그는 AI가 컴퓨터를 프로그래밍하는 새로운 강력한 방식이며, 언젠가 범용 인공지능(AGI)을 개발하게 된다면 반드시 소프트웨어 2.0을 사용하게 될 것이라고 본다.
다음은 Andrej Karpathy가 2017년에 발표한 글의 전문이다:
가끔 사람들은 신경망을 "기계학습 도구 모음 중 하나일 뿐"이라고 생각한다. 장단점이 있고 특정 분야에서 유용하며 Kaggle 경쟁에서 이기는 데 도움이 된다는 것이다. 불행히도 이러한 관점은 완전히 숲을 보지 못하고 나무만 보는 것이다. 신경망은 단순한 또 다른 분류기가 아니라, 우리가 소프트웨어를 개발하는 방식과 관련된 근본적인 전환의 시작을 의미한다. 그것이 바로 소프트웨어 2.0이다.
우리는 소프트웨어 1.0에 익숙하다. 그것은 파이썬, C++ 등의 컴퓨터 언어로 작성된다. 프로그래머가 컴퓨터에게 명시적인 지침을 제공하며 구성된 것으로, 각 줄의 코드를 작성함으로써 프로그래머는 특정 이상적인 동작을 가진 프로그램 공간 상의 한 점을 결정한다.

반대로 소프트웨어 2.0은 더 추상적이며 인간이 이해하기 어려운 언어(예: 신경망의 가중치)로 개발된다. 아무도 직접 이 코드를 작성할 수 없다. 왜냐하면 수백만 개에 달하는 가중치를 다뤄야 하며(나도 시도해봤지만), 일종의 가중치를 직접 쓰는 것은 매우 어렵기 때문이다.

대신 우리는 프로그램의 행동 목표를 정의한다(예: "데이터셋의 입력-출력 쌍을 따르게 하기", 또는 "바둑 게임에서 승리하기"). 그리고 프로그램의 골격(예: 신경망 구조)을 작성하여 전체 프로그램 공간에서 검색 가능한 부분집합을 정의한 후, 계산 자원을 이용해 그 안에서 작동 가능한 프로그램을 탐색한다.
신경망의 경우, 이 탐색을 프로그램 공간의 연속적인 부분집합으로 제한하고 역전파와 확률적 경사하강법(SGD)을 사용하는데, 놀랍게도 매우 효과적이다.

보다 구체적으로 비교하자면, 소프트웨어 1.0은 사람이 설계한 소스코드(예: .cpp 파일)를 효율적으로 작동하는 바이너리 파일로 컴파일하는 과정이다. 반면 소프트웨어 2.0의 소스코드는 일반적으로 두 부분으로 구성된다. 1) 기대되는 동작을 정의하는 데이터셋; 2) 대략적인 구조는 주어졌으나 세부 사항을 채워야 하는 신경망 구조. 신경망을 훈련시키는 과정은 데이터셋을 바이너리 파일(최종 신경망)로 컴파일하는 과정이라 할 수 있다. 오늘날 대부분의 실제 응용에서 신경망 구조 및 훈련 시스템은 점점 표준화되어 상품화되고 있으며, 따라서 대부분의 활발한 '소프트웨어 개발' 작업은 데이터셋을 조직하고, 증가시키고, 조정하고, 정제하는 형태로 변모하고 있다. 이는 소프트웨어를 반복하는 개발 패러다임을 근본적으로 변화시키며, 개발팀을 두 부류로 나눈다. 즉, 소프트웨어 2.0 프로그래머(데이터 라벨러)는 데이터셋을 편집하고 확장하고, 소수의 인원은 훈련 인프라와 분석, 시각화, 라벨링 인터페이스 등을 유지관리한다.
현실 세계의 많은 문제들에서, 데이터를 수집하는 것(더 일반적으로 말해, 원하는 행동을 정의하는 것)이 명시적으로 프로그램을 작성하는 것보다 훨씬 쉽다는 것이 입증되었다. 위에서 언급한 이유들과 아래에서 소개할 소프트웨어 2.0의 여러 이점들로 인해, 산업 전반에서 소프트웨어 1.0에서 소프트웨어 2.0로의 거대한 전환이 진행되고 있다. 소프트웨어 1.0이 세상을 잠식하고 있었고, 이제 소프트웨어 2.0(AI)이 소프트웨어 1.0을 잠식하고 있는 것이다.
진행 중인 전환
이 전환의 구체적인 분야들을 살펴보자. 지난 몇 년간, 복잡한 문제를 해결하기 위해 명시적으로 코드를 작성하려는 시도를 포기하고 소프트웨어 2.0으로 전환했음을 알 수 있다.
-
이미지 인식: 이미지 인식은 예전에는 특징 공학(feature engineering) 중심이었으며, 맨 마지막에 약간의 머신러닝(예: SVM)을 추가하는 정도였다. 이후 ImageNet 같은 더 큰 데이터셋과 합성곱 신경망(CNN) 구조 공간에서의 탐색을 통해 더욱 강력한 시각 특징을 발견했다. 최근에는 심지어 우리가 직접 작성한 네트워크 구조조차 믿지 않고, 최적의 구조를 찾기 위해 비슷한 방법으로 탐색하고 있다.
-
음성 인식: 예전 음성 인식은 전처리, 가우시안 혼합 모델(GMM), 은닉 마르코프 모델(HMM) 등이 많이 포함되었지만, 지금은 거의 오직 신경망만 필요하다. 여기에 관련된 유명한 농담이 있는데, 1985년 Fred Jelinek이 말했다. "언어학자를 해고할 때마다 우리 음성 인식 시스템 성능이 조금씩 향상된다."
-
음성 합성: 음성 합성은 역사적으로 다양한 연결 기술(splicing techniques)을 사용했지만, 현재는 WaveNet과 같은 최첨단(SOTA) 대규모 합성곱 네트워크가 원시 오디오 신호를 직접 생성한다.
-
기계 번역: 기계 번역은 예전에는 통계 기반 구문 방법을 사용했지만, 신경망이 빠르게 지배적인 위치를 차지하고 있다. 내가 가장 좋아하는 구조는 다국어 훈련과 관련된 것으로, 하나의 모델이 임의의 소스 언어에서 임의의 목표 언어로 번역할 수 있으며, 매우 약한 지도 하에서(심지어 완전한 비지도 하에서도) 작동 가능하다.
-
게임: 오랫동안 사람들은 수작업으로 체스 프로그램을 작성해 게임을 수행했지만, 지금은 AlphaGo Zero(체스판의 원시 상태를 관찰하고 대결하는 합성곱 네트워크)가 체스 분야에서 가장 강력한 플레이어가 되었다. 나는 DOTA 2, 스타크래프트 등 다른 분야에서도 비슷한 결과가 나올 것이라고 예측한다.
-
데이터베이스: AI 분야 밖에 있던 더 많은 전통 시스템들도 소프트웨어 2.0로 전환되는 초기 징후를 보이고 있다. 예를 들어, '인덱스 구조 학습(Learned Index Structures)' 연구에서는 기존의 데이터 관리 핵심 구성 요소를 신경망으로 대체하여, B-트리의 캐시 최적화 버전보다 최대 70% 더 빠르며 메모리는 10분의 1만 사용한다.
위의 많은 링크들이 Google에서 수행한 작업임을 눈치챘을 것이다. 그 이유는 현재 Google이 자신의 코드를 소프트웨어 2.0으로 전환하는 선두주자이기 때문이다. '범용 모델(one model to rule them all)'이라는 아이디어는 다양한 분야의 통계적 성과를 통합하여 세계를 종합적으로 이해하려는 그림을 그린다.
소프트웨어 2.0의 장점
왜 우리는 복잡한 프로그램을 소프트웨어 2.0으로 옮기기를 선호할까? 물론 간단한 답은 실제로 더 잘 작동한다는 것이다. 그러나 소프트웨어 2.0을 선택해야 할 더 많은 이유들이 있다. 소프트웨어 2.0(합성곱 신경망为代表)과 소프트웨어 1.0(프로덕션 수준의 C++ 코드库为代表)을 비교했을 때, 소프트웨어 2.0의 장점은 다음과 같다.
-
동질화된 컴퓨팅: 일반적인 신경망은 행렬 곱셈과 ReLU(Rectified Linear Unit) 함수라는 두 가지 연산만으로 구성된다. 전통적 소프트웨어의 명령어는 훨씬 더 복잡하고 이질적이다. 소프트웨어 1.0 방식으로 아주 적은 핵심 코드(예: 행렬 곱셈)만 구현하면 되므로, 정확성과 성능 검증이 훨씬 쉬워진다.
-
칩 친화적: 신경망이 필요한 명령어 집합이 상대적으로 작기 때문에, 칩 상에서 이를 구현하는 것이 더 쉽다. 예를 들어 맞춤형 ASIC 칩, 뉴로모픽 칩(neuromorphic chips) 등을 사용할 수 있다. 저전력 스마트 기기가 우리 주변에 넘쳐날 때, 세상은 크게 바뀔 것이다. 예를 들어, 사전 훈련된 합성곱 네트워크, 음성 인식, WaveNet 음성 합성 네트워크를 저렴하고 작은 장치에 탑재하여 다른 장치와 연결할 수 있다.
-
일정한 실행 시간: 일반적인 신경망의 각 순방향 전달(forward pass)은 계산량(FLOPs)이 매우 일관된다. 수작업으로 작성한 복잡한 C++ 코드에서 발생하는 다양한 실행 분기(execution branches)는 소프트웨어 2.0에는 존재하지 않는다. 물론 동적 그래프를 원할 수도 있지만, 실행 흐름은 일반적으로 엄격히 제한된다. 이런 경우에도 거의 예기치 못한 무한 루프에 빠지지 않을 것을 보장할 수 있다.
-
일정한 메모리 소비: 위의 항목과 관련하여, 동적 메모리 할당이 필요 없기 때문에 하드디스크와의 swap 가능성은 거의 없으며, 코드 내 메모리 누수가 발생할 가능성도 없다.
-
높은 이식성: 전통적인 바이너리 파일이나 스크립트에 비해 일련의 행렬 곱셈 연산은 다양한 컴퓨팅 환경에서 실행하기 훨씬 쉽다.
-
유연한 개발: C++을 작성 중이고 누군가 당신에게 개발 속도를 2배로 늘리라고 요구하면(성능을 희생할 수 있음), 기존 시스템을 조정하는 것은 결코 쉬운 일이 아니다. 그러나 소프트웨어 2.0에서는 단순히(계산 그래프에서) 경로의 절반을 제거하고 재훈련하면, 정확도는 약간 떨어지지만 두 배 빠른 결과를 얻을 수 있다. 이것은 마법처럼 느껴진다. 반대로, 더 많은 데이터와 컴퓨팅 파워를 얻으면, 계산 그래프를 확장하고 재훈련함으로써 즉시 더 나은 실제 성능을 얻을 수 있다.
-
모듈 통합을 통한 최적화: 일반적인 소프트웨어는 여러 모듈로 분해되며, 각 모듈은 공유 함수, API 또는 엔드투엔드 방식으로 통신한다. 그러나 소프트웨어 2.0에서는 처음에 독립적으로 훈련된 두 개의 상호작용 모듈이 있다면, 전체 시스템에서 역전파(backpropagation)를 쉽게 수행할 수 있다. 웹 브라우저가 페이지 로딩 속도를 높이기 위해 하위 수준 명령어를 자동 설계하거나, 특정 데이터에 따라 동작을 자동 조정하는 컴퓨터 비전 라이브러리(openCV 등)를 가져올 수 있다고 상상해보라. 소프트웨어 2.0에서는 이것이 기본 기능이다.
-
당신보다 낫다: 마지막으로 가장 중요한 점은, 많은 수직 분야에서 신경망이 생성한 코드가 당신이나 내가 작성한 코드보다 더 낫다는 것이다. 현재로서는 적어도 이미지, 비디오, 음성 분야에서는 그렇다.
소프트웨어 2.0의 단점
소프트웨어 2.0에도 몇 가지 단점이 있다. 최적화 후에는 실용적으로 매우 효과적인 대규모 네트워크를 얻을 수 있지만, 왜 그렇게 효과적인지는 설명하기 어렵다. 많은 분야에서 우리는 이해하기는 쉽지만 정확도가 90%인 모델을 선택할 수 있고, 아니면 이해는 안 되지만 정확도가 99%인 모델을 선택할 수 있다.
소프트웨어 2.0은 직관적이지 않거나 어색한 오류를 발생시키며, 더 나쁜 경우 '조용히 실패(making silent errors)'할 수 있다. 예를 들어, 훈련 중에 편향된 데이터를 조용히 받아들였다면, 데이터가 수백만 건에 달할 때 원인을 분석하고 확인하는 것이 매우 어려워진다.
마지막으로, 소프트웨어 2.0의 기묘한 특성이 계속 나타나고 있다. 예를 들어, 적대적 샘플(adversarial examples)과 공격 샘플의 존재는 소프트웨어 2.0의 설명 불가능성을 더욱 부각시킨다.
소프트웨어 2.0 프로그래밍
소프트웨어 1.0 코드는 우리가 직접 작성한 코드다. 소프트웨어 2.0 코드는 평가 기준(예: "훈련 데이터를 올바르게 분류하기")에 따라 최적화된 코드다. 원리가 명확하지 않지만 반복적으로 성능을 평가할 수 있는 프로그램은 모두 이 전환에 적합하다. 왜냐하면 사람이 작성한 코드보다 최적화 방법이 찾은 코드가 훨씬 더 낫기 때문이다.

우리가 추세를 바라보는 시각은 중요하다. 신경망이 단지 머신러닝 도구 모음 중 하나인 좋은 분류기일 뿐이라고 보는 것이 아니라, 소프트웨어 2.0이 부상하는 새로운 프로그래밍 패러다임이라는 인식을 갖게 되면, 추론이 훨씬 더 명확해지고, 앞으로 해야 할 일이 많다는 것도 분명해진다.
구체적으로 말하면, 우리는 소프트웨어 1.0 개발을 지원하는 수많은 도구를 발명했다. 강력한 IDE는 문법 강조, 디버거, 프로파일러, 심볼 점프, git 통합 등의 기능을 제공한다. 소프트웨어 2.0에서는 프로그래밍이 데이터셋의 축적, 정리, 정제를 통해 이루어진다. 예를 들어, 어떤 극단적인 경우에 신경망이 실패하면 코드를 작성해서 문제를 수정하는 대신, 해당 경우의 더 많은 데이터를 가져오는 것으로 충분하다.
누가 최초의 소프트웨어 2.0 IDE를 개발할 것인가? 그것은 데이터셋 관련 모든 워크플로우—데이터 축적, 시각화, 정제, 라벨링, 생성—에서 유용해야 한다. 아마도 이 IDE는 각 샘플의 손실값에 따라 네트워크가 잘못 라벨링되었다고 의심되는 이미지를 추출하거나, 예측을 통해 적절한 라벨을 제안함으로써 라벨링을 보조하거나, 네트워크 예측의 불확실성에 따라 라벨링에 적합한 샘플을 추천할 수 있을 것이다.
비슷하게 Github은 소프트웨어 1.0 시대에 매우 성공적인 사이트였다. 소프트웨어 2.0 시대의 Github은 가능할까? 소프트웨어 2.0 시대에는 저장소가 데이터셋이 되고, 커밋은 데이터 라벨의 추가 및 편집으로 구성될 것이다. 전통적인 패키지 관리 및 배포 수단(pip, conda, docker 등)은 소프트웨어 설치 및 배포를 더 쉽게 해준다. 소프트웨어 2.0 시대에는 어떻게 소프트웨어를 더 효과적으로 배포하고, 공유하고, 가져오고, 실행할 수 있을까? 신경망에서 conda에 대응하는 것은 무엇일까?
요약하자면, 저비용으로 반복 평가가 가능하고 알고리즘을 명시적으로 설계하기 어려운 분야에서는 소프트웨어 2.0이 점점 더 인기를 끌게 될 것이다. 전체 개발 생태계와 이 새로운 프로그래밍 패러다임에 어떻게 적응할지를 고려할 때, 많은 흥미로운 기회들이 존재한다. 장기적으로 이 프로그래밍 패러다임은 밝은 미래를 가지고 있다. 왜냐하면 우리가 언젠가 범용 인공지능(AGI)을 개발하게 된다면, 반드시 소프트웨어 2.0을 사용하게 될 것이기 때문이다.
TechFlow 공식 커뮤니티에 오신 것을 환영합니다
Telegram 구독 그룹:https://t.me/TechFlowDaily
트위터 공식 계정:https://x.com/TechFlowPost
트위터 영어 계정:https://x.com/BlockFlow_News










