딥러닝–클로쥬어와 하스켈에서의 기능 언어의 아름다움

딥러닝은 인공 신경망을 기반으로 하는 기계 학습 방법의 하위 집합이다. 이들은 뇌와 같은 생물학적 시스템의 정보 처리 및 분산 통신 노드에서 영감을 얻었습니다. 딥 러닝에서 각 레벨은 입력 데이터를 약간 더 추상적이고 복합적인 표현으로 변환하는 방법을 배웁니다. 예를 들어,얼굴 인식 시스템에서 픽셀은 시스템의 한 레이어 일 수 있지만 가장자리는 다른 레이어 일 수 있고 눈은 다른 레이어 일 수 있으며 얼굴은 다른 레이어 일 수 있습니다. 딥 러닝 방법의 복잡성으로 인해 프로그래밍 커뮤니티에서 인기있는 기존 패키지를 사용할 수 있습니다. 그러나 딥러닝 시스템의 생산에서 성능과 안전은 기업이 클로저 및 하스켈과 같은 함수형 프로그래밍 언어를 선택하도록 유도하는 두 가지 문제입니다.

image

딥 러닝 구현의 어려움

딥 러닝 시스템을 생산에 도입 할 때 신경망에는 백만 개의 매개 변수가 포함될 수 있습니다. 데이터가 빠르게 폭발하여 이러한 매개 변수를 학습 할 수 있습니다. 이러한 데이터 폭발은 안전한 동시성 및 병렬 처리 기능을 갖춘 효율적인 프로그래밍 언어에 의해서만 달성 될 수있는 성능을 필요로합니다. 신경 네트워크의 복잡성으로 인해 계층에서 계층으로 전달되는 데이터로 인해 프로그래밍 언어가 이 데이터를 처리하는 방식의 단순성과 일관성이 중요합니다. 이 경우 안전성은 원래 데이터의 상태를 일관된 방식으로 보존하는 기능을 의미하지만 단순성은 성능을 극대화하면서 코드 기반을 쉽게 읽고 유지 관리 할 수 있음을 의미합니다.

함수형 프로그래밍이 딥러닝에 더 적합한 이유

딥러닝을 구현할 때 발생할 수 있는 몇 가지 어려움을 해결하기 위해 프로그래머는 함수형 프로그래밍 언어가 솔루션을 제공할 수 있다는 것을 발견하고 있습니다.

컴퓨터 과학에서 함수형 프로그래밍은 계산을 수학 함수의 평가로 취급하고 상태 및 변경 가능한 데이터의 변화를 피하는 프로그래밍 패러다임입니다. 그것은 수학적 사고에 가까운 프로그래밍 패턴입니다.

딥러닝 모델은 본질적으로 수학적 모델이다. 예를 들어,인공 신경망은 연결된 노드로 구성되며 각 노드는 간단한 수학 연산을 수행합니다. 함수형 프로그래밍 언어를 사용하여 프로그래머는 이러한 수학 연산을 연산 자체에 더 가까운 언어로 설명 할 수 있습니다. 이러한 프로그램을 작성하는 명시적인 방법은 코드베이스를 훨씬 쉽게 읽고 유지 관리합니다.

동시에 딥러닝 알고리즘의 구성적 특성은 신경 작업의 각 계층에서 계층 또는 기능이 작업을 수행하기 위해 함께 연결되는 경향이 있음을 의미합니다. 이것은 함수형 프로그래밍 언어의 기능적 체인을 사용하여 쉽게 구현할 수 있습니다.

image

또한 딥 러닝에서는 함수가 데이터에 적용될 때 데이터가 변경되지 않습니다. 새 값은 순차적으로 출력 될 수 있지만 데이터 자체는 일관성을 유지합니다. 함수형 프로그래밍 언어의 불변성 기능을 통해 프로그래머는 원래 불변 데이터 집합을 변경하지 않고 새 값이 생성 될 때마다 새 데이터 집합을 만들 수 있습니다. 이를 통해 신경망 전체에서 데이터의 일관성을 쉽게 유지할 수 있습니다.

마지막으로 딥 러닝의 구현과 관련된 많은 매개 변수와 교육 데이터는 병렬 처리 및 동시성이 생산 수준의 딥 러닝 시스템을 만드는 열쇠임을 의미합니다. 병렬 처리 란 학습 프로세스의 속도를 높이기 위해 다른 스레드에서 스레드를 실행하는 것을 의미합니다. 동시성이란 충돌을 피하기 위해 스레드를 관리하는 기능을 의미합니다. 함수형 프로그래밍은 동시성 및 병렬 처리를 무료로 허용합니다. 즉,순수 함수가 상태 비저장 인 함수형 프로그래밍은 항상 특정 입력에 대해 동일한 출력을 생성하고 모든 함수를 격리 할 수있는 기능을 제공하며 원할 때마다 실행할 수 있습니다. 이를 통해 동시성 및 병렬 처리를 훨씬 쉽게 관리 할 수 있습니다. 교착 상태 및 경쟁 조건과 같은 문제를 처리 할 필요가 없습니다. 이것은 수학적으로 정확한 유형 계층구조인,강력한 타입을 정의합니다.

클로저

딥 러닝에서 함수형 프로그래밍이 인기를 얻고 있으며 딥 러닝에 사용할 수있는 강력한 패키지로 인해 클로저는 이제 월마트와 페이스 북과 같은 회사에서 선호되고 있습니다.. 이 프로그램은 자바 바이트코드 프로그램의 갯수를 카운트하고,스크립트의 메인 형식을 합계냅니다,그리고 확인되지 않은 실행 텍스트 파일을 찾습니다..

클로저

클로저에서 동시 프로그래밍의 힘은 자바 스레드 시스템을 대체하지 않고 오히려 함께 작동합니다. 핵심 데이터 구조는 변경할 수 없으므로 스레드간에 쉽게 공유 할 수 있습니다. 동시에 프로그램의 상태 변경이 가능하지만 상태가 일관성을 유지하도록 하는 메커니즘을 제공합니다. 동일한 참조를 수정하려는 두 트랜잭션 사이에 충돌이 발생하면 그 중 하나가 사용 중지됩니다. 명시 적 잠금이 필요하지 않습니다.

(import '(java.util.concurrent Executors))(defn test-stm (let (fn (dotimes (dosync (doseq (alter r + 1 t)))))) (range nthreads))] (doseq (.get future)) (.shutdown pool) (map deref refs)))(test-stm 10 10 10000) -> (550000 550000 550000 550000 550000 550000 550000 550000 550000 550000)

소스

클로저에서 병렬 처리는 저렴

딥 러닝에서 모델은 많은 양의 데이터를 학습해야합니다. 병렬 처리는 다른 스레드에서 여러 스레드를 실행하는 것을 의미합니다. 저렴한 병렬 처리는 상당한 성능 향상을 의미합니다. 파티션을 맵과 함께 사용하면 비용이 적게 드는 병렬 처리를 얻을 수 있습니다.

(defn calculate-pixels-2 (let (doall (map (fn (let (get-color (process-pixel (/ row (double *width*)) (/ col (double *height*)))))) x))) work)] (doall (apply concat result))))

소스

클로저에서 함수를 연결한다는 것은 명확성

클로저에서 매우 적은 데이터 유형에 대한 많은 함수가 있음을 의미합니다. 함수는 다른 함수에 인수로 전달 될 수 있으므로 딥 러닝에서 체인 기능을 사용할 수 있습니다. 실제 수학적 모델에 더 가까운 구현을 통해 클로저 코드는 읽기 및 유지 관리가 간단 할 수 있습니다.

;; pipe arg to function(-> "x" f1) ; "x1";; pipe. function chaining(-> "x" f1 f2) ; "x12"

출처

클로저에서의 정체성과 상태는 안전을 제공한다

클로저에서 각 모델의 정체성은 어느 시점에서든 하나의 상태를 갖는다. 그 상태는 결코 변하지 않는 진정한 가치입니다. 신원이 변경되는 것처럼 보이는 경우 이는 다른 상태와 연관되어 있기 때문입니다. 새로운 값은 오래된 함수입니다. 신경망의 각 계층 내부에는 원래 데이터의 상태가 항상 유지됩니다. 함수의 출력 인 새로운 값을 가진 각 데이터 세트는 독립적으로 작동 할 수 있습니다. 즉,이러한 데이터 집합에 대해 안전하게 또는 경합에 관계없이 작업을 수행할 수 있습니다. 우리는 언제든지 데이터의 원래 상태로 다시 참조 할 수 있습니다. 따라서이 경우 일관성은 안전을 의미합니다.

라이브러리 및 제한

역사적으로 피질 기계 학습 라이브러리에는 클로저에서 기계 학습 알고리즘을 구현하는 데 필요한 모든 것이 포함되어 있습니다. 최근 딥러닝을 위한 오픈소스 엠엑스넷 프레임워크의 인기가 높아짐에 따라 딥러닝을 구현하는 것이 더 쉬워졌습니다.

현재 클로저에는 다양한 아피스와 머신러닝 라이브러리가 존재하지만,여전히 유창해지는 가파른 학습 곡선이 있다. 오류 메시지는 비밀 일 수 있으며 회사는 기계 학습 시스템을 확장하는 데 사용하기 위해 선행 투자 할 의향이 있어야합니다. 그러나 클로저 사용에 수반되는 라이브러리의 수와 크기가 지속적으로 증가하는 경우에만 해당됩니다.

하스켈

하스켈은 형식 추론 및 지연 평가로 정적으로 입력되는 기능 언어입니다. 그것은 미란다 프로그래밍 언어의 의미를 기반으로 기계 학습을 구현하기 위해 더 표현 빠르고 안전한 것으로 간주됩니다.

하스켈의 유형 안전은 안전성과 유연성을 제공합니다

유형 안전은 변수가 보유할 수 있는 값의 유형에 대한 제약 조건을 정의합니다. 이는 불법 작업을 방지하고 메모리 안전성을 향상 시키며 논리 오류를 줄이는 데 도움이됩니다. 지연 평가는 값이 필요할 때까지 하스켈이 식의 평가를 지연 시킨다는 것을 의미합니다. 또한 반복 평가를 피하므로 실행 시간을 절약 할 수 있습니다. 동시에 게으른 평가를 통해 무한한 데이터 구조를 정의 할 수 있습니다. 이것은 프로그래머에게 무한한 수학적 가능성을 제공합니다.

하스켈의 간단한 명시 적 코드는 명확한 구현을 제공합니다

하스켈의 가장 큰 장점 중 하나는 매우 명시적인 수학적 구조로 알고리즘을 설명 할 수 있다는 것입니다. 몇 줄의 코드로 모델을 나타낼 수 있습니다. 당신은 또한 당신이 수학 방정식을 읽을 수있는 것과 같은 방법으로 코드를 읽을 수 있습니다. 이것은 기계 학습의 딥 러닝 알고리즘과 같은 복잡한 알고리즘에서 매우 강력 할 수 있습니다. 예를 들어,피드 포워드 신경망의 단일 계층의 아래 구현은 코드가 얼마나 읽을 수 있는지를 보여줍니다.

import Numeric.LinearAlgebra.Static.Backproplogistic :: Floating a => a -> alogistic x = 1 / (1 + exp (-x))feedForwardLog :: (KnownNat i, KnownNat o) => Model (L o i :& R o) (R i) (R o)feedForwardLog (w :&& b) x = logistic (w #> x + b)

소스

하스켈의 멀티 코어 병렬 처리는 딥 러닝에서 일반적인 신경망은 모델을 정의하는 백만 개의 매개 변수를 포함합니다. 또한 이러한 매개 변수를 학습하려면 많은 양의 데이터가 필요하며 이는 계산 상 매우 시간이 많이 걸립니다. 단일 시스템에서 여러 코어를 사용하여 메모리와 프로세스를 병렬로 공유하는 것은 딥 러닝을 구현할 때 매우 강력 할 수 있습니다. 그러나 하스켈에서는 멀티 코어 병렬 처리를 구현하는 것이 쉽습니다. 그러나 생물 과학과 같은 다른 분야에 대한 어플리케이션도 있습니다.. 한편 병렬 및 동시성은 병렬 처리 및 동시성에 사용됩니다.

하스켈에서 개발된 일부 기계 학습 라이브러리가 있지만,프로덕션 준비가 된 하스켈 구현을 위해서는 기본 구현이 여전히 수행되어야 할 것이다. 특정 딥 러닝 및 기계 학습 작업에 사용할 수있는 공공 도서관은 제한적이지만 하스켈의 인공 지능 사용도 제한 될 것입니다. 아이온 테크놀로지 및 크레디트 스위스 글로벌 모델링 및 분석 그룹과 같은 회사들은 하스켈을 구현에 사용하고 있습니다.

결론

딥 러닝 모델은 함수의 특정 레이어링이 필요한 복잡한 수학적 모델입니다. 클로저 및 하스켈과 같은 함수형 프로그래밍 언어는 종종 모델의 수학에 더 가까운 더 깨끗한 코드로 복잡성을 나타낼 수 있습니다. 이를 통해 시간 절약,효율성 및 코드 기반을 쉽게 관리 할 수 있습니다. 함수형 프로그래밍의 특정 속성을 사용하면 이러한 언어의 구현이 다른 언어의 구현보다 안전 할 수 있습니다. 인공 지능 기술의 개발이 진행됨에 따라 인공 지능의 대규모 시스템 개발 프로젝트의 요구에 따라 이러한 언어를 평가하는 것이 더 널리 보급 될 것입니다.

이 문서는 개발자가 코드 뒤에,개발자를위한 미디어의 일부입니다. 코드 뒤에 방문하여 더 많은 기사와 동영상을 발견!

기여하고 싶으십니까? 게시 해!

트위터에 우리를 따르라 계속 지켜봐 주시기 바랍니다!

일러스트 빅토리아 루셀

답글 남기기

이메일 주소는 공개되지 않습니다.