솔직히 어려웠다. 윈도우에서 탐색기를 이리 저리 이동하면서 파일 옮기면 불편했던게 터미널 창으로 다 된다는게 편리하긴했는데 익숙치않은 명령어가 너무 많았다. 그래도 인상깊었던 명령어는 아래와 같다.
참고할 만한 글 링크
공부하고 싶었던 주제였기 때문에 발표하겠다고 나섰던 주제였습니다.
adagrad Rmsprop adam등 이름만 알고 썻던 알고리즘에 대해서 더 알게될 수있었습니다.
특히 여러 문제점들을 비교적 간단한 수학적 trick을 통해서 해결하는 모습은 역시 사람은 배워야 한다는 것을 보여주는 것 같았습니다.
특히 adam은 정말 다양한 분야에도 다 잘 적용되는 점이 참 신기했습니다.
아시웠던 점은 헤시안 매트릭스를 통한 2차 근사와 관련된 내용을 강의에선 깊게 다루지 않아서 좀 더 궁금증이 생겼습니다. 단순히 full batch를 사용할때에는 L-BFGS을 사용하라 정도로만 언급이 되었습니다.
짤은 최초의 moment1, moment2가 작은 탓에 초반의 잘못된 경로가 velocity로 많이 지정되는 문제점을 해결하기 위한 bias correction을 해결하는 트릭
참고할만한 글들
그라디언트, 헤시안, 자코비안 정리
0021 Gradient Descent & Momentum
음성데이터를 다룬 첫 경험이었다. 혼동되는 개념이 너무 많아서 개념을 정리해보았다.
예를 들어 가장 간단한 아날로그 소리는 이런 sin식으로 나타낼수 있다고한다.
위같은 아날로그 소리를 samping을 통해서 이산화하는데 이때의 비율을
sampling rate라고 한다. 최대 주파수의 최소 2배 이상의 속도로 sampig rate를 잡으면 디지털과 아날로그를 정보손실 없이 가능하다고 한다. 그 후 양자화, 부호화를 통해서 디지털화를 한다고한다.
wav data
한 소리는 여러 소리 파형이 합쳐진 복합파라고 볼 수 있는데 그 복합파를 1개의 wav파일로 정리한 것이라 볼 수 있다고 한다. 특히 wav 파일은 소리를 1차원 시계열 데이터로 정리한 것이라고 한다.
위의 wav를 주파수 대역별로 나누어 별도로 해석할수있는데 퓨리에 변환을 통해서 스펙트럼을 나눌수있다고한다. 그렇게 스펙트럼을 만들면 2차원의 데이터로 소리를 나타 낼 수 있다고 한다. 식으로 표현하면 아래와 같다고 한다.
N은 FFT size, Window를 얼마나 많은 주파수 밴드로 나누는 가를 의미
Duration은 sampling rate를 window로 나눈 값
T=window/sampling rate.
duration은 신호주기보다 5배이상 길게 잡아야한다고한다. 즉
T(window)=5T(Signal).
예를 들어 440Hz신호의 window size는 5(1/440)이 됩니다.
는 window 함수를 나타냅니다.
일반적으로는 hann window가 많이 쓰입니다.
n는 window size입니다.
window 함수에 들어가는 sample의 양입니다.
n이 작을 수록 low-frequency resolution을 가지게 되고,
high-time resolution을 가지게 되고,
n이 길수록 high-frequency를 가지고 되고
low-time resolution을 가지게 됩니다.
H는 hop size를 의미합니다. 윈도우가 겹치는 사이즈입니다. 일반적으로는 1/4정도를 겹치게 한다고한다.
주의) sampling rate = 1/T
보통 rate는 1/T로 계산을 하구요. 즉 T = 1/sampligrate가됨
: T=window/sampling rate, Duration은 T와 다른 요소이다.
ggplot2만 사용했었는데 기본적인 개념은 비슷한 느낌. 아직 세부적인 사용은 좀 더 해봐야할 껏 같다. seaborn의 색감이 이쁘긴한것같다.
generate_text(model, tokenizer, init_sentence="<start> i love", max_len=7)
'<start> i love you <end> '
내가 학습 시킨 모델에 i love라는 단어를 주었을 때의 작사였다. 잘 학습이 됐다.
사이킷런의 특징에 대한 설명하는 PyCon 2018 영상 링크
이렇게 쉽게 여러 모델들을 구현할수있는게 python에 있는지 몰랐었다..
진짜 편리하게 학습할수있게 되어있는것같다.
scikit-learn 홈페이지
scikit-learn Api 설명
투 포인터 방식이 인상깊어서 정리해보았다.
기본적인 원칙은
일단 먼저 sort를 하고 시작한다.
그후 첫자리에 left, 가장 끝에 right를 지정한후
연산을 처리한다. 목표값과 연산된 값을 비교해
값이 작으면 left를 우측으로, 값보다 크면 right를 왼쪽으로 이동시킨다.
이 간단한 구조로 O()을 O()까지 낮출수 있다니 신기하다
실제 leetcode 15번의 풀이에서 활용하는 법은 아래와 같다.
class Solution:
def threeSum(self, nums):
results = []
nums.sort()
for i in range(len(nums)-2):
if i > 0 and nums[i] == nums[i-1]:
continue
left, right = i+1 , len(nums) - 1
while left < right:
sum = nums[i] + nums[left] + nums[right]
if sum < 0:
left += 1
elif sum > 0:
right -= 1
else:
results.append((nums[i], nums[left],nums[right]))
while left < right and nums[left] == nums[left+1]:
left += 1
while left < right and nums[right] == nums[right -1]:
right -= 1
left += 1
right -= 1
return results