Problem Solving with Algorithms

728x90
반응형

첫 강의: [AI 인공지능 머신러닝 딥러닝/Julia] - Julia 프로그래밍 - 언어 및 강의 소개

 

Julia 프로그래밍 - 언어 및 강의 소개

Julia 프로그래밍 언어줄리아(Julia)는 고성능의 수치 해석 및 계산과학의 필요 사항을 만족시키면서 일반 목적 프로그래밍에도 효과적으로 사용될 수 있도록 설계된 고급 동적 프로그래밍 언어이

inner-game.tistory.com

 

 

 

이전 강의: [AI 인공지능 머신러닝 딥러닝/머신러닝] - Julia 프로그래밍 - 머신 러닝을 위한 Julia

 

Julia 프로그래밍 - 머신 러닝을 위한 Julia

[AI 인공지능 머신러닝 딥러닝/Julia] - Julia 프로그래밍 - 언어 및 강의 소개 Julia 프로그래밍 - 언어 및 강의 소개Julia 프로그래밍 언어줄리아(Julia)는 고성능의 수치 해석 및 계산과학의 필요 사항

inner-game.tistory.com

 

 

 

 

줄리아 프로그래밍 - 자동 미분 Automatic differentiation ❘ Forward- & Reverse-Mode AD

 

 

머신 러닝을 위한 Julia
동기 부여Julia AD 생태계

 

선형 맵

속성
행렬에 대한 연결
구성

 

파생상품

파생상품이란 무엇인가요?
미분가능성
야코비안
야코비안-벡터 곱
사슬 법칙

 

순방향 모드 AD

함수 구성
전방 축적
야코비안 계산

 

 

역방향 모드 AD

야코비안 계산
함수 구성
역축적
그래디언트 계산
-- JVP를 사용하여 그래디언트 계산
-- VJP를 사용하여 그래디언트 계산

 

Julia의 자동 미분

규칙 기반 AD
체인룰즈.jl

-- 순방향 모드 AD 규칙
-- 역방향 모드 AD 규칙
-- 체인룰스코어.jl
코드 내성 ⁽⁺⁾
-- 깊이 1: AST 표현
-- 심도 2: 줄리아 IR
-- 심층 3: LLVM 표현
-- 깊이 4: 네이티브 코드
Zygote.jl
-- 주의 사항
Enzyme.jl
-- Low-level API
Finite differences
-- Caveats
-- FiniteDiff.jl 및 FiniteDifferences.jl
포워드디프.jl
DifferentiationInterface.jl
DifferentiationInterfaceTest.jl
다른 AD 패키지

 

 


 

 

 

 

 

 

머신 러닝을 위한 Julia

확률 적 경사 하강법과 같은 경사 기반 최적화 방법을 신경망에 적용하려면 매개변수에 대한 손실 함수의 경사를 계산해야 합니다.
딥 러닝 모델은 크고 복잡해질 수 있으므로 임의의 함수를 취할 수 있는 기계가 있으면 좋을 것입니다.그리고 그 미분을 반환합니다 . 이를 자동 미분(AD)이라고 합니다.

참고: 이 강의에서는 여러 자동 미분 패키지를 소개합니다. 처음 로드하는 데 몇 분이 걸릴 수 있습니다.

 

 

동기 부여Julia AD 생태계

Julia는 12개가 넘는 AD 시스템을 보유하고 있습니다. 사용 가능한 패키지 목록은 juliadiff.org 에서 확인할 수 있습니다 . 목록은 유형별로 정렬되어 있습니다.

 

1. 역방향 모드
2. 정방향 모드
3. 상징적인
4. 유한 차분

 

그리고 그 외에도 좀 더 이색적인 접근법들이 있습니다. 이미 추상적으로 들리는 용어들이지만, 이러한 범주 내에서도 다음과 같은 차이점들이 존재합니다.

 

AD 시스템 연산자는 오버로딩 방식 인가요 , 아니면 소스 간(source-to-source) 방식 인가요 ? 어떤 표현 수준에서 동작하나요? 스칼라 함수에서만 작동하나요? 고차 AD를 허용하나요 ?

 

 

여러분은 이러한 용어에 익숙하지 않을 수 있으므로, 이 강의의 목적은 다양한 AD 패키지 간의 접근 방식의 차이점을 설명하고 각각의 장단점을 개략적으로 설명하는 것입니다.
이러한 목적을 위해, 우리는 한 걸음 물러나서 선형 사상 과 미분이라는 두 가지 기본적인 수학 개념을 다시 살펴보겠습니다 .

 

 

 

선형 맵

속성

선형 맵로 표현될 수 있습니다행렬.

Visualizations curtesy of Stephan Kulla under CC0 license.

예를 들어 많은 일반적인 기하학적 변환은 선형 맵입니다.변환행렬 표현각도별 회전투영에 대한-중심선반사를 통해-중심선스트레칭을 따라-중심선평행하게 전단-중심선압착 기초를 위해,.

 

구성 행렬 곱셈에 대한 연결구성두 개의 선형 맵,선형 맵이기도 합니다. 유한 차원 벡터 공간에서 선형 사상의 구성은 행렬 곱셈에 해당합니다.

 

행렬에 대한 연결

 

구성

 

 

 

 

파생상품

파생상품이란 무엇인가요?

 

 

미분가능성

 

 

 

야코비안

 

 

야코비안-벡터 곱

 

 

 

사슬 법칙

 

 

순방향 모드 AD

함수 구성

 

 

 

전방 축적

 

 

야코비안 계산




 

 

 

 

역방향 모드 AD

야코비안 계산

 

 

 

함수 구성

 

 

역축적

 

 

그래디언트 계산

 

 

-- JVP를 사용하여 그래디언트 계산

 

 

-- VJP를 사용하여 그래디언트 계산

 

 

 

Julia의 자동 미분

규칙 기반 AD

 

 

체인룰즈.jl

ChainRules.jl 은 다양한 기능에 대한 순방향 및 역방향 모드 AD 규칙을 구현하는 패키지로, 다운스트림 Julia AD 패키지가 모든 규칙을 다시 구현하지 않고도 해당 규칙을 재사용할 수 있도록 해줍니다.

API를 자세히 설명하는 대신, 함수의 순방향 및 역방향 규칙이 어떻게 구현되는지 살펴보겠습니다 . 혼란을 피하기 위해 ChainRules 문서sin 에서 사용하는 표기법 대신 저희가 사용하는 표기법을 사용하겠습니다 .


ChainRules.jl 문서에는 명명법과 표기법을 소개하는 잘 작성된 수학 입문서 가 있습니다.

 

 

-- 순방향 모드 AD 규칙

 

 

 

 

-- 역방향 모드 AD 규칙

 

 

 

 

 

-- 체인룰스코어.jl

 

자체 패키지를 개발하는 경우 특정 AD 구현에 의존하지 않고도 패키지에 대한 순방향 및/또는 역방향 규칙을 정의할 수 있는 가벼운 종속성인 ChainRulesCore.jl 을 활용할 수 있습니다 .

 

코드 내성 ⁽⁺⁾

 

 

-- 깊이 1: AST 표현

 

 

-- 심도 2: 줄리아 IR

 

 

-- 심층 3: LLVM 표현

 

-- 깊이 4: 네이티브 코드

 

	.text
	.file	"foo"
	.globl	julia_foo_3762                  # -- Begin function julia_foo_3762
	.p2align	4, 0x90
	.type	julia_foo_3762,@function
julia_foo_3762:                         # @julia_foo_3762
; ┌ @ /home/runner/work/julia-ml-course/julia-ml-course/lectures/L6_Automatic_Differentiation.jl#==#32f6945a-d918-4cdc-8c4d-8d3cd898392d:1 within `foo`
# %bb.0:                                # %top
; │┌ @ int.jl:87 within `+`
	add	rdi, 2
; │└
; │┌ @ math.jl:1576 within `sqrt`
; ││┌ @ float.jl:294 within `float`
; │││┌ @ float.jl:268 within `AbstractFloat`
; ││││┌ @ float.jl:159 within `Float64`
	vcvtsi2sd	xmm0, xmm0, rdi
; ││└└└
; ││ @ math.jl:1578 within `sqrt` @ math.jl:686
	js	.LBB0_2
# %bb.1:                                # %L7
; ││ @ math.jl:1578 within `sqrt` @ math.jl:687
	vsqrtsd	xmm0, xmm0, xmm0
; ││ @ math.jl:1578 within `sqrt`
	ret
.LBB0_2:                                # %L5
	push	rbp
; ││ @ math.jl:1578 within `sqrt` @ math.jl:686
	movabs	rax, offset j_throw_complex_domainerror_3764
	movabs	rdi, 140291160999088
	mov	rbp, rsp
	call	rax
.Lfunc_end0:
	.size	julia_foo_3762, .Lfunc_end0-julia_foo_3762
; └└
                                        # -- End function
	.section	".note.GNU-stack","",@progbits

 

 

Zygote.jl

Zygote.jl 은 널리 사용되는 역방향 AD 시스템입니다. ChainRules.jl을 사용하여 "IR 수준 소스 간" 변환을 수행합니다. 즉, Julia IR을 참조하여 미분 대상 함수의 구조를 분석합니다. 그런 다음 VJP를 계산하는 함수를 생성합니다.

 

-- 주의 사항

앞서 배웠듯이 Zygote의 역모드 AD는 여러 다른 함수로 구성된 함수에 체인 규칙을 적용합니다.

 

 

 

 

 


항상 AD 패키지 설명서의 제한 사항/주의 사항/주의 사항에 대한 섹션을 읽으세요.

 

 

 

Enzyme.jl

Enzyme.jl 은 LLVM 소스 간 변환을 수행하는 새롭고 실험적인 AD 시스템으로 , 정방향 및 역방향 AD를 모두 지원합니다. 현재 ChainRules.jl을 지원하지 않고 자체 EnzymeRules를 사용합니다 . Enzyme은 성능이 뛰어나며 변형 함수를 지원합니다.

 

패키지가 빠르게 개발 중이고 API가 아직 완전히 안정화되지 않았으므로 이 예제에서는 Enzyme을 사용한다는 점에 유의하세요 v0.13.

 

-- Low-level API

Enzyme은 autodiffVJP 및 JVP를 위한 저수준 API인 를 내보냅니다. 이 함수는 사용자가 할당을 제어하여 성능을 극대화할 수 있도록 하기 때문에 좀 더 고급 기능입니다. 

 

효소는 autodiff역모드 AD와 함께 사용될 수 있습니다.

 

 

및 순방향 모드 AD

 

 

 

 


Enzyme은 LLVM 수준에서 차별화되므로 C, C++, Swift, Julia, Rust 등 모든 LLVM 기반 언어를 차별화할 수 있습니다. 자세한 내용은 Enzyme 웹사이트 에서 확인할 수 있습니다 .

 

 

Finite differences 유한차분

이 강의에서는 순방향 및 역방향 AD를 설명하기 위해 선형 사상과 총 미분으로 바로 넘어갔습니다. 이를 통해 가장 간단한 방법인 유한 차분법을 건너뛰었습니다 .

 

 

 

 

-- Caveats 주의 사항

 

 

-- FiniteDiff.jl 및 FiniteDifferences.jl

FiniteDiff.jl 과 FiniteDifferences.jl 은 유한 차분을 구현하는 두 가지 유사한 패키지입니다. 설명서 에는 두 패키지의 차이점이 나와 있습니다.

 

- FiniteDifferences.jl은 기본적으로 모든 유형을 지원하는 반면 FiniteDiff.jl은 배열형 유형만 지원합니다.- 
- FiniteDifferences.jl은 고차 근사를 지원합니다.
- FiniteDiff.jl은 할당을 최소화하기 위해 신중하게 최적화되었습니다.
- FiniteDiff.jl은 희소 야코비안의 효율적인 계산을 위해 벡터 채색을 지원합니다.

 

 

FiniteDiff.jl

 

유한차이.jl

 

 

포워드디프.jl

마지막으로, 연산자 오버로딩을 사용하여 순방향 AD를 구현하는 ForwardDiff.jl을 살펴보겠습니다 . ForwardDiff는 Dual 숫자 형식을 도입합니다.

 


ForwardDiff.jl은 가장 안정적이고 신뢰할 수 있는 Julia AD 패키지 중 하나로 간주됩니다.

 

 

DifferentiationInterface.jl 

우리는 약간씩 다른 구문과 반환 유형을 가진 다섯 개의 서로 다른 패키지를 사용하여 그래디언트를 계산했습니다. 이 모든 패키지에 대한 공통 인터페이스가 있다면 좋지 않을까요?

 

DifferentiationInterface.jl 은 정확히 이런 역할을 합니다.


저는 저자 중 한 명이므로 중립적이지는 않지만 DifferentiationInterface를 통해 모든 백엔드를 사용하는 것을 권장합니다!

 

 

특징은 다음과 같습니다.

- 여러분이 원하는 모든 1차 및 2차 연산자 (그래디언트, 야코비안, 헤시안...)

- 제자리 및 제자리 외 차별화

- 준비 메커니즘(예: 캐시를 미리 할당하거나 테이프를 기록하는 것)

- 내장된 희소성 처리

- DifferentiationInterfaceTest를 통해 접근 가능한 테스트 및 벤치마킹 유틸리티

 

 

 

DifferentiationInterfaceTest.jl

호출하면 benchmark_differentiation유용한 모든 백엔드에 대한 벤치마크 결과가 제공됩니다 DataFrame.

 

 

Julia 패키지를 개발할 때도 DifferentiationInterfaceTest.jl을 사용할 수 있습니다.

 

 

이 예시에서는 모든 테스트가 통과되었으며, 이를 통해 모든 백엔드를 벤치마킹할 수 있었습니다. 프로젝트 진행 중에 패키지 테스트 에 대해 더 자세히 알아보실 수 있습니다.

 

 

다른 AD 패키지

이제 AD에 대한 지식을 갖추었으니 juliadiff.org 에서 Julia AD 패키지 목록을 살펴보세요 !

 

 

감사의 말

AD 시스템에 대한 통찰력 있는 대화와 이 강의에 대한 피드백을 주신 Niklas Schmitz 에게 진심으로 감사드립니다 . 그가 없었다면 이 강의는 지금의 형태로 존재하지 못했을 것입니다.

이 강의에 대한 추가적인 영감은 다음에서 나왔습니다.
- Robert Ghrist 교수의 사슬 법칙에 대한 강의
- SciML 책의 순방향 모드 AD 장
- 해커를 위한 Mike Innes의 차별화 , 여기 렌더링됨

추가 참고 자료
- Griewand & Walther, 미분 평가: 알고리즘 미분의 원리와 기법
- 스피박, 다양체에 대한 미적분학

 

 

이 블로그의 관련 글

 다음 강의: [AI 인공지능 머신러닝 딥러닝/Julia] - 줄리아 프로그래밍 - 딥러닝, Deep Learning

 

줄리아 프로그래밍 - 딥러닝, Deep Learning

첫 강의: [AI 인공지능 머신러닝 딥러닝/Julia] - Julia 프로그래밍 - 언어 및 강의 소개 Julia 프로그래밍 - 언어 및 강의 소개Julia 프로그래밍 언어줄리아(Julia)는 고성능의 수치 해석 및 계산과학의 필

inner-game.tistory.com

 

 

 

 

[AI 인공지능 머신러닝 딥러닝/인공지능 수학] - 2025 인공지능·머신러닝 입문자를 위한 핵심 통계개념 완전정복 (1/2)

 

2025 인공지능·머신러닝 입문자를 위한 핵심 통계개념 완전정복 (1/2)

안녕하세요! 오늘은 최근에 시청한 유튜브 신박Ai의 “[인공지능을 위한 머신러닝101] 머신러닝을 위한 기초통계개념” 영상을 바탕으로, 인공지능과 머신러닝을 공부하는 데 꼭 필요한 통계 개

inner-game.tistory.com

 

 

 

[AI 인공지능 머신러닝 딥러닝/Julia] - Julia 프로그래밍 무료 강의 추천 - Datacamp 데이터캠프 데이타캠프 줄리아

 

Julia 프로그래밍 무료 강의 추천 - Datacamp 데이터캠프 데이타캠프 줄리아

데이터캠프 datacamp.com 라는 사이트를 추천드립니다. Coursera나 edX 처럼 무료 교육으로 아주 유명한 사이트입니다.사이트주소 : datacamp.com 간단히 구글계정으로 로그인 하시면 됩니다. 지원되는 언

inner-game.tistory.com

 

 

 

728x90
반응형
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
250x250