블로그

Reinforcement learning in artificial and biological systems

Reinforcement learning in artificial and biological systems 리뷰논문에 대한 글.

저자들은 biological inspired RL 개발쪽에 관심이 많은듯하다. 본인들이 개발한 RL 시스템은 spike-based deep, continuous local learning(DCLL)이다. 그래서 machine RL의 한계에 대해 지적하는데, 환경이 제한되어있고 정적이라는 점이 큰 한계라고 한다. Open AI Gym, game environment 등 모두 크지 않고, 정적이다. 하지만 biology의 learning enviroment는 아주 dynamic하다. 대신 ML RL에서는 문제는 어려운 경향이 있고(ex, chess, 바둑 등), biology의 RL 문제는 쉬운 경향이 있다(ex, armed bandit 등 간단한 선택 문제). 이는 실험의 용이함, 논문으로 만들어질 가능성에 의한 것이지 실제 biology의 RL 문제가 쉽다는 것은 아니다. Goal을 어떤 식으로 설정하느냐에 따라 문제가 복잡해 질 수 있고, 그러면 행동의 sequence, 선택의 다양성, 그로인한 경우의 수가 폭발적으로 증가하게 되기 때문에 biology 연구에는 간단한 행동패러다임만 다루는 것이다. 예를 들어 커피샵 선택 문제를 보자. 스타벅스나 투썸 또는 동네 커피점을 선택하고, 그 선택이 강화되어 행동이 학습되는 과정까지 선택에 영향을 주는 요소는 너무도 많다. 거리, 선택 할때의 시간, 자리의 한적한 정도, 하루 중의 시간 말고 계절별 선호의 차이, 커피숍에서 하려는 일과의 성격(친구를 만냐느냐? 아님 혼자 가느냐?), 음료의 종류 등등. 이런 요소들을 고려하기 시작하면 도무지 정상과학이라고 할 수 없는 영역으로 가게된다. 그럼에도 불구하고 이런 sequence를 고려하는 연구자가 있긴한데, human psychology, fMRI study를 하는 Timothy Behrens다. SfN 2017때 그가 한 plenary lecture를 들었었다. 또한 Behrens는 2009에 The computation of social behavior.라는 review 논문은 science에 실기도 했다.

Biology system에서 RL은 PFC와 striatum 사이의 connection에 value가 coding되고 있는 듯하다. 또한 time scale이 fast나 slow system으로 나눠질 수 있는데, 여기서 말하는 fast, slow개념은 Botvinick의 fast, slow와는 별개의 개념이다. Biology RL의 amygdala에 fast learning(fear response의 반응속도와 학습 속도를 생각해보라), striatum에 slow learning이 coding되고 있는 듯하다. 이런 학습에는 ML의 back-propagation이 학습기전으로 적용될리는 없고, 당연히 RPE 이론에 기반한 dopamine이 중요한 modulator로 작용할 것이라고 보고 있다.

RL에서 Model의 필요에 대해서 생각해보면, model-based learning의 경우 bayesian inference가 가능해진다. Model에서 예측하는 것과 실제 시도에서 나온 결과를 bayes rule로 update할 수 있기 때문이다. 그렇기 때문에 data-efficient하다. 하지만 model-free learning 의 장점도 있기 때문에 mixture expert 방식을 사용할 거라고 보고 있다.

이 팀은 hierarchical RL 개념도 제안하는데, biology 또는 human behavior를 고려하면 plausible한 제안이다. Goal를 subgoal로 나누고, subgoal에 대해서는 각각 training 시키는 것이다. Subgoal training system마다 reward는 서로 다르게 설정할 수 있는데, 최근 curiosity를 reward로 준 Artificial agent에 대해 논문이 나온바 있다. 실제 인간의 학습 훈련에서도 사용될 수 있는 개념이다. Subgoal로 나눈다는 것은 task를 subtask로 나눈다는 의미이고, 이렇게 쪼개야 학습, 일의 효율이 높아짐은 잘 알려져 있는 사실이다.

Distributional Reinforcement Learning in the Brain 리뷰논문(TINS 2020) 요약

 

Distributional Reinforcement Learning in the Brain

Biological and Artificial Intelligence

  • 위에서 말한 세 논문을 인용하면서 이것이 neuroscience과 AI사이의 훌륭한 상호작용이라 칭하고 있다.

Development of Distributional Reinforcement Learning in AI

  • RL, 그 중에서도 DQN을 소개하고, 여기서 distributional RL(이제 distRL로 줄인다.)이 개발되었음을 설명하고 있다.
  • distRL의 핵심 아이디어는 미래 보상, 상태 이전이 필연적으로 stochastic하다는 것을 전제로 기대 보상(가치)를 평균값으로 산출하지 않고, 아예 확률 분포로 추정하도록 학습한다는 것이다.

How Distributional RL works

  • distRL에서 중요한 점은 1) 어떻게 보상의 분포가 표상되는가? 2) 어떻게 그것을 학습하는가? 1
  • 먼저 개발된 categorical dist RL은 histogram을 학습한다. 하지만 그 다음에 개발된 quantile dist RL은 population coding 개념을 이용했고, 이것의 학습 알고리듬이 좀 더 biological plausible하다고 주장한다.

Learning from Prediction Errors

  • Rescorla-Wagner rule에 따라 가치가 갱신된다는 것을 생각해보자.

V \leftarrow V + \alpha \cdot \delta

  • 여기서 \alpha 는 learning rate parameter이고, \delta 는 prediction error다. 즉 \delta := R - V 이다. 이 RW rule은 잘 알려져 있다시피 dopamine firing(\delta)이 prediction error에 반응한다는 것으로도 유명하다. 또한 RL algorithm중 temporal difference learning으로 발전되었다.
  • 하지만 둘은 미묘하게 다른데, RW rule의 경우 \delta 가 실제 보상 R과 차이를 통해 계산된다. 하지만 TD learning에서는 다음 스텝에서 얻는 보상에 더해 \gamma V(s_{t+1}) (discounted value of next state)가 포함된다. 즉 TD learning은 \delta := r_{t} + \gamma V(s_{t+1}) - V(s_{t})이다. 이건 boostrapping으로 알려진 절차이고 그렇기 때문에 정확하지 않다. DQN으로 접목되기 힘들었던 이유가 parameter를 업데이트하면 V(s_{t+1}) 까지 변해버리기 때문이다.2 물론 그럼에도 불구하고 실질적으로 TD learning은 local optimum으로 잘 수렴하긴 한다.

Toward Distributional RL

  • 보상이나 가치를 평균이라는 하나의 값으로 뭉쳐버리면 실제 현실을 충분히 반영하지 못 한다. 실제 현실이 아주 낮은 확률을 가진 높은 보상과, 높은 확률을 가진 낮은 보상 등이 섞여 있다면 이것의 평균은 낮을 것이고 그러면 비록 확률은 낮지만 높은 보상의 기회를 놓치게 된다. 그래서 dist RL이 등장하는데, 확률 분포 자체를 학습하는 것은 까다로워 보이나, 연구자들은 이를 단순한 수식 변환으로 해결했다.

V \leftarrow V + \alpha \cdot \left\lbrace \begin{array}{l l} -1 &\text{if} \quad \delta \leq 0 \\  \ \ 1 &\text{if} \quad \delta > 0 \end{array} \right.

  • 그 결과 value는보상의 평균이 아니라, median으로 수렴하게 된다. 3
  • 여기서 quantile regression으로 갈 때는 \alpha 라는 learning rate를 추가한다. 그러면 무조건 50% 순위로 수렴하던 아까와는 달리, \alpha 값의 비율에 따라 quantile rank로 수렴하게 된다.

V \leftarrow V + \left\lbrace \begin{array}{l l} \alpha^{-}_{i} \cdot (-1) &\text{if} \quad \delta \leq 0 \\ \alpha^{+}_{i} \cdot (+1) &\text{if} \quad \delta > 0 \end{array} \right.

  • 여기서 \alpha^{+}_{i} + \alpha^{-}_{i} = 1이면 \alpha^{+}_{i}의 수치가 곧 수렴하게 되는 순위이고, 그렇지 않으면 두 값에 \alpha^{+}_{i}가 차지하는 비율이 수렴하게 되는 순위가 된다. 이걸 논문에서는 \tau_{i}\text{-th} quantile을 이라고 표현하고 있다.
    • 따라서 \alpha 값이 서로 다른 value predictor를 동시에 학습 시키면 서로 다른 \tau_{i} 순위의 predictor가 학습되고 이걸 마치 population code와 같다고 한다.
  • 이제 위의 quantile rule에서 +1,\, -1 값 대신 prediction error, 즉 \delta 값을 대입하면 median을 비롯한 순위에 따른 quantile이 아니라, 보장에 대한 기대값(가치)에 수렴하므로, 이걸 expectile이라고 한다. 만약 \alpha^{+} 값의 비중이 0.5라면 mean 값에 수렴할 것이다. 4

Distributional RL as the Process of Minimizing Estimation Errors

  • 이제 위 알고리듬을 보편적인 선형회귀 문제로 살펴보자. N번 시도했을 때 보상을 얻고, 그 때 기대하고 있던 가치(V)와의 mean squared error(MSE)는 다음 과 같다.

MSE(V) = \frac{1}{N} \sum^{N}_{n=1} (r_{n} - V)^{2}

  • MSE 가 V에 의존적인 함수로 변환된다. V를 변화시켜 MSE를 최소화 시키는 것이 머신러닝의 기본이다. 제일 좋은 방법은 보상 값 전체를 저장했다가 한 번에 계산하는 것이지만, 실용적인 방법은 아니다. 실용적인 방법은 잘 알려져있는 Stochastic gradient descent(SGD)다. 이걸 수학적으론 MSE를 미분하고 그 값에 따라 V를 업데이트하는 것인데, 이건 결국 RW rule과 동일해진다.
  • 그리고 SGD에 입력하는 error function을 MSE로 할 것인지, absolute error로 할 것인지, 아니면 quantile \tau 값으로 할 것인지, 여기 error 값을 곱해 expectile로 할 것이지에 따라 위에서 다뤘던 learning과 일치하게 된다.

parametrized problem

  • 이 section제목은 원래 논문에 없지만, 임의로 넣음.
  • V 값이 function approximator를 통해 구해질 경우 우리는 function approximator에 있는 coefficients 또는 parameter를 갱신해야 한다. 이는 다음과 같이 표현 할 수 있다.

\theta \leftarrow \theta + \alpha \sum^{M}_{i=1} \bigtriangledown_{\theta}q_{i}(\theta) \cdot \left\lbrace \begin{array}{l l} -(1-\tau) &\text{if} \quad \delta_{i,n} \leq 0 \\ \quad \; \tau &\text{if} \quad \delta_{i,n} > 0 \end{array} \right.

  • 위 수식에서 expectile로 변경하려면 q_{i}e_{i} 값으로 변경하고 prediction error term \delta_{i,n} 도 추가하면 된다. 다시 정리하면 위에서 직접 update했던 value들 대신 parameter \theta에 gradient form를 추가해 \theta를 update하는 방법이다. DNN이 들어간다면 복잡해지긴 하겠지만, 기본 아이디어는 같다.

Traditional and Distributional RL in the Brain

  • VTA의 dopaminergic neuron의 다양성에 대해 강조하고 있다. 다른 영역의 뉴런에 비해 꽤 homogeneous하긴 하지만, 최근 연구 결과에서 Kim et al, 2019은 VTA의 dopaminergic neuron이 꽤 diverse하다는 것을 보고 했다. 그리고 이것이 RPE 신호의 체계적인 variation의 근거라고 주장한다. Distributional RL은 이 다양성에 대한 설명을 제공할 수 있다.

Empirically Testing Distributional RL

  • 비대칭적 스케일 factor인 \tau = \frac{\alpha^{+}}{\alpha^{+} + \alpha^{-}}가 distRL의 핵심 아이디어다. 그럼 \alpha는 무엇인가? 아마 dopaminergic neuron이 RPE에 대해 상대적으로 firing rate를 증가시키는지 감소시키는지에 의해 결정될 것이다.
  • dopaminergic neuron에서도 optimistic, pessimistic predictor가 따로 있다고 가정하는 것이다. optimistic dopamine neuron이라면 high value predictor이고, 따라서 큰 reward가 주어져야 RPE가 matching될 것이다. \tau가 높은 값으로 매겨져 있다면, RPE에 반응하는 reversal point가 높은 쪽으로 치우쳐져 있다는 의미다.
  • 이 가설을 시험하기 위해 Dabney et al. 2020에서는 optogenetical 방법을 사용했다. 그 결과 어떤 뉴런은 주어지는 보상의 평균 보다 아래에서도 firing했고, 어떤 뉴런은 보상의 평균보다 높아야 firing했다.
  • 이런 가설을 바탕으로 dopaminergic neuron firing rate를 decoding했더니 각기 다른 reversal point of expectile을 가진 것으로 추정되었다. 이전에는 이런 결과를 단순히 noise로 해석할 수밖에 없었다.
  • DistRL 가설, 이론은 몇몇 실험적 예측을 제시한다. 예를 들어 도파민 뉴런은 다른 보상 분포에서 비교적 일정한 비대칭적 \tau를 보여야 한다. 낙관적 세포는 음의 RPE에서 느리게 학습되어야 한다. 또한 downstream target에서도 quantile-like 분포가 관찰되어야 한다. 조작적 조건화 실험에서도 DistRL에 준하는 행동이 관찰되어야 한다. 낙관적 도파민 신경세포에 의해 risk-taking behavior가 유도되어야 한다.

Is Distributional RL Biologically Plausible?

Diversity in Asymmetric Scaling and Independent Loops

  • Positive, negative RPE 신호가 분리되어 처리된다는 증거가 있다. Lateral habenula에 lesion을 줄 경우 negative RPE에 둔감해지고, 결과적으로 optimistic하게 된다.
  • Optimistic, pessimistic dopamine neuron이 topographically organized 되어 있다.

Learning Rate Parameters in Striatum and Cortex

  • Positive, negative RPE signal이 striatum에서 D1, D2 type dopamine receptor를 발현하고 있는 target neuron에 따라 다르게 처리된다.

How Does the Brian Benefit from Distributional Representations?

  • DistRL의 concept은 multilayer neural net에 적합하다. 단순히 reward나 value의 평균 scalar을 전달하는 것보다 distribution을 backpropagation하기 때문에 hidden layer에 rich information이 표상된다.
    • 이런 distribution coding이 보상이나 확률에 대해서 뿐만 아니라, delay interval이나 “distributions in the common currency of value”를 표상할 수 있는지는 더 연구가 필요하다.
  • Quantile code는 nonparametric code이다. population coding에 대해서는 probabilistic population code(PPC)나 distributed distributional code가 있고, 이것들은 parametric code가 된다. 예를 들어 PPC는 Gaussian distribution을 따른다. 하지만 dopamine neuron의 RPE도 이럴지는 모른다.
    • PCC가 Bayesian inference를 지지하고, Quantile code는 cumulative prospect theory의 단순 버전을 지지할 수 있다.

Distributional TD Updates in the Brain

  • 전통적 RL에서는 RPE(\delta)가 single, local 추정치로 계산될 수 있다.
  • 하지만 distRL에서는 당연히 reward distribution을 알 수 있을만큼의 sample이 필요하다.
    • 그래서 single unit이 아니라 neuronal population 개념으로 접근해야 한다.

  1. 최근 내가 관심을 하고 있는 free-energy principle이나 Bayesian brain theory와 관련해서 확률분포를 어떻게 신경세포 또는 neural unit이 학습하는가? 는 중요한 이슈이다.
  2. 그래서 deep mind에서 DQN을 처음 이용할 때 replay buffer를 이용해 마치 stochastic images를 DQN이 학습하는 것처럼 만들었다.
  3. Rank에서 50%로 향하게 되므로.
  4. Expectile에 대한 부연 설명. quantile은 상위 몇%에 있는 해당 single value를 반환한다. 하지만 expectile은 해당 %를 기준으로 두 집단으로 나눈 다음 해당 집단의 평균 값을 구하고, 두 값의 평균을 구하는 작업이다. 그래서 cumulative density function을 적용할 수 없는 것이다. 만약 상위 1% quantile이라면 해당 수치가 이미 발생 확률을 내포하고 있다.(1/100이므로) 하지만 1% expectile은 하위 99%의 평균값에 의해 수치가 조정되어 버리므로 발생 확률과 상관이 없다.

개인 웹서버 설치 및 워드프레스 설치

APM, 워드프레스 설치

처음 따라한 방법은

우분투 워드프레스 설치 방법 – HiSEON

우분투 MySQL 설치 – HiSEON

여기에 속칭 APM 3종 세트를 설치하는 방법과 워드프레스까지 설치하는 방법이 나와있다.

하지만 여기서 https 인증 때매 삽질하다 찾은 블로그는 좀더 자세하고 정확하다. 그런데 복잡해서 한참 헤멤.하지만 다음 웹싸이트에서 지시하는대로 하면 새로운 user를 만들어서 그 user의 home안에 www 파일을 넣어 둘 수 있어서 관리하기 좋다. 물론 보안 문제도 어느 정도 해결한다. (user 이름은 domain이름과 같은 neuroailab)

한번에 끝내는 Ubuntu 웹서버세팅 (우분투 서버세팅)

https 인증서는 certbot을 쓰면 되고, 이때 certbot 홈페이지에 가서 ppa 추가해서 certbot을 upgrade해줘야 한다. 기존 우분투 저장소에 있는 certbot은 인증2.0을 지원하지 않아서 apache 에러가 뜬다.

Certbot

환경설정은 lael.be라는 사람이 제작한 생성기를 쓴다.

Apache2 환경설정 생성기

이 환경설정 중에 Header는 주석처리한다. module을 받으면 해결될 거 같기도 한데… 그닥 중요하지 않을듯 하다.

또한 AssignUserID 라는 명령어를 쓰려면 다른 module을 받아야 한다. lael.be 홈피에는 중간쯤에 받으라고 되어있지만, 다른 HiSEON을 따라 거의 대부분 설치했으므로 누락되었다.

$ sudo apt install libapache2-mpm-itk

워드프레스 관련

latex 는 JetPack 플러그인에서 제공하는 것을 사용하면 편하다.

이메일 플러그인때문에 꽤 고생했는데(구글 api 인증 등의 삽질…), 이메일 보내는 플러그인이 없으면 서버 자체가 메일을 보낼 수 있어야 하지만, 메일 서버는 구축이 까다롭다.

이메일 플러그인 중이 가장 사용이 쉬운 것은 Easy WP plugin

  • 이건 smtp 를 사용하지만, OAUTH가 필요없다. 일반 메일 app 설정과 유사한 방식으로 set-up할 수 있다.
  • 2-factor 로긴 설정을 회피하기 위해 app전용 password를 발급받아 로긴에 활용하면 되고, 이건 쥐메일에서 제공한다.

서버 ip 바인딩 관련

도메인을 사둔 가비아에서 DNS 설정중 A 레코드에 ip주소를 입력해야한다. 난 neuroailab.com 만 ip랑 바인딩 해두었다. 이건 부가서비스 안에 DNS 관리 툴인가하는 곳 안에 숨겨져 있다. 나머지 도메인들은 포워딩만 해두었다.

자동 종료APACHE2

내증상은 ssh를 나왔을때 apache2가 자동 종료되면서 웹서버가 다운되는 것.

해결법은 apache config 수정

server $ sudo vi /etc/apache2/apache.config # 이 명령어 수정
# 다음 라인 추가
Mutex posixsem

When I close ftp server goes down

  • 위 북마크를 참고함.
  • 위와 같이 해두면, web server 용 사용자가 sudo권한이 없어도 상관없음.

우분투 Ubuntu 사용자 관리 user manage 관련 CLI 명령어

  • 사용자 추가
$ sudo adduser USERID # 뒤에 sudo 를 추가하면 sudo 유저로 추가
  • 사용자를 sudo 유저로 만들기, 권한 빼기.
$ sudo usermod -aG sudo USERID # sudo 유저로 만들기
$ sudo deluser USERID sudo # sudo 유저에서 빼기
  • sudo 유저 그룹 확인
$ grep "sudo" /etc/group
  • 사용자 전환
$ su - USERID
  • root 계정 활성화
$ su # 이렇게 하면 root계정으로 접속하는데, 처음에는 비번이 없다. 그래서 아예 접속이 안되는데
# 이럴땐 초기 비밀번호를 셋팅해줘야한다.
$ sudo passwd 
$ sudo passwd USERID # 특정 사용자의 비번 설정.

Trouble shooting for Ubuntu GPU machine

GPU driver가 사라졌을때

!!!요부분은 아직 경험하지 못한 부분 우분투 14.04를 쓸 땐 CUDA driver를 썼지만, 16에서는 따로 드라이버를 잡았으로, 그 드라이버를 새로 깔아서 해결해보자. 그전에 이 현상이 안 일어나야겠지…. 자동 업데하다 nvidia랑 충돌나서 생기는 문제인 거 같은데.

  • !!!결론적으로 자동 업데가 화근이었다.
  • 최근 받은 미루웨서 매뉴얼에 따르면 GUI autoupdate를 켜놓으면 dist-upgrade를 자동으로 하는데
  • 그러면 추천 앱+커널이 업데된다고 한다. 커널이 업데되면 임의로 깔은 nvidia driver를 인식 못 함…
  • 따라서 GUI autoupdate를 never로 해두고, 터미널에서 dist-upgrade가 아닌 update -> upgrade만 할것!!
  • 만약 dist-uprade를 해서 그래픽 드라이버를 인식못하면, nvidia driver만 다시 깔면됨
  • CUDA는 건드리지 말것.

일단 피씨 본체의 reset 버튼으로 강제 리부팅을 하면 날아 가는듯하다 (모니터 Input source 때문에 몇번 리부팅했을때 괜찮은 걸보면 GPU 컴퓨팅 중에 하면 날아가는듯)

CUDA가 날아갔을때

  1. 재부팅후 ctrl+alt+F1으로 가상터미널 접속
  2. sudo service lightdm stop
  3. su sh cuda_7.5.18_linux.run(nvidia driver yes, openGL no)
  4. sudo reboot 하면 드라이버는 가동
  5. CUDNN다시 카피(sudo nautilus로 관리자 탐색기 띄우고 Home/cuda에 있는 파일들을 usr/local/cuda로 각각 옮긴다.)

2단계에서 lightdm을 stop하면 가상타미널도 stop되면서 black screen이 되는 경우가 있다.

그럴땐 일단

sudo service lightdm start

를 깜깜이 상태에서 쳐서 화면을 살리고, 다음 단계를 진행한다.

이 현상의 원인은 가상터미널에서도 graphic mode가 작동되어서 그런듯 하다.

그걸 끄기 위해서 grub을 재설정 해줘야함.

sudo nautilus

관리자 탐색기에서 /etc/default/grub 을 backup한다.

# GRUB_TERMINAL=console# GRUB_GFXMODE=640x480

으로 터미널 그래픽 모드를 비활성화시킨다.

sudo update-grub

그럽을 업데해주고 sudo vim grub에서 다음과 같은 라인을 추가한다.

gfxpayload=nomodeset
~$ sudo reboot

그럼 이제 가상터미널에서 lightdm을 stop해도 화면이 보인다.

모니터 먹통 현상 해결

input source 바꾸기 등으로 우분투로 부터의 display가 안뜰때

ctrl + alt + F1 으로 가상터미널로 들어가 display가 뜨는걸 확인하고(optional display output을 refresh 필수인듯)

ctrl + alt + F7 으로 GUI환경으로 다시 돌아 온다.

우분투 무한 로긴

  • 최근 우분투 18.04로 업그레이드하면서 생겼던 문제.
  • 업그레이드하면서 당연히 kernel이 업데되면서 그래픽카드 드라이버는 재설정해줘야 했음. 이건 예상했던 문제.
  • 그래픽 카드를 재설치하고, 심지어 CUDA에 포함된 그래픽카드로 다시 잡아도 문제가 해결안되었음.
  • 다음과 같은 방법으로 (아마) 해결된 듯.
  • 그전에 기본으로 깔리는 gdm에서 lightdm으로 바꿔줘야함.
sudo dpkg-reconfigure lightdm
  • 물론 내 경우에는 이것으로 해결되진 않았음. 참고싸이트
ls -lA
-rw-------  1 root root   53 Nov 29 10:19 .Xauthority
# 위와 같이 뜬다면
chown username:username .Xauthority 
# 내 로긴네임
# 여기에 추가로
ls -ld /tmp
drwxrwxrwt 15 root root 4096 Nov 30 04:17 /tmp
# 앞의  drwx~~~~~ 가 제대로 되어 있는지 확인
sudo chmod a+wt /tmp
  • 아마도 위의 두가지 해결법(.Xauthority와 tmp) 중에 하나가 먹힌 듯하다.
  • 4GPU machine을 업글하지 말고 환경만 유지 할것.

ubuntu 16.04 matlab issue

우분투 업글 이후 matlab이 crush 남.

locate libstdc++.so.6

를 쳐서, matlab 위치를 찾는다. 나같은 경우

/usr/local/MATLAB/R2016a/sys/os/glnxa64/libstdc++.so.6/usr/local/MATLAB/R2016a/sys/os/glnxa64/libstdc++.so.6.0.17

이었음.

/usr/local/MATLAB/R2016a/sys/os/glnxa64

로 가서 파일이름을 바꿔줌.

sudo mv libstdc++.so.6 libstdc++.so.6.oldsudo mv libstdc++.so.6.0.17 libstdc++.so.6.0.17.old

이렇게 하면 matlab의 rendering이 제대로 잡힘.

high resolution display vs Application issue

matlab의 경우, matlab command에서 다음과 같이 입력하면 해결.

>> s = settings;s.matlab.desktop.DisplayScaleFactor
>> s.matlab.desktop.DisplayScaleFactor.PersonalValue = 2

참고 문서

Ubuntu 18.04 scaling

  • high resolution display를 쓰고 있는데, 18.04에는 100%, 200%단위로만 display scaling 설정이 가능하다.
  • 하지만 text scaling만 조정하는 방법이 있다.
gsettings set org.gnome.desktop.interface text-scaling-factor 1.5

tensorflow hanging during computation

cifar10_multi_gpu tutorial test중에 연산하다가 자꾸 멈추는 현상이 지속됨 비슷한 보고, 또 다른 보고 등이 있음. 종합해본 결과 ASUS motherboard의 PCIe와 nvidia card 가 서로 궁합이 안맞는 것으로 추정.

해결

  1. ASUS bios update 내껀 ASUS X99E WS임. 업데이트는 USB에 cap 파일을 담아서 재부팅때 BIOS에 들어가서 해줌. 업데이트 하면서 BIOS setting CPU를 performance mode로 바꿈.
  2. nvidia driver update
  3. grub setting 바꾸기
$ sudo vi /etc/default/grubLINUX_.....="biosdevname=0 pcie_aspm=off" # in editor deleted "quiet splash"
  • net.ifnames=0 도 추가했더니, network setting이 이상해짐. 빼고 pcie error는 안 뜸.

apt-get update error message

GPG key problem

  • update를 할 때, R과 관련된 것이 error를 낼 때가 있다.
GPG error: <https://cloud.r-project.org/bin/linux/ubuntu> focal-cran40/ InRelease: The following signatures were invalid: EXPKEYSIG 51716619E084DAB9 Michael Rutter <marutter@gmail.com>
  • 이럴땐 다음과 같이 해결한다.
$ sudo apt-key list
# expire된 key를 확인, grep를 써도 됨.
/etc/apt/trusted.gpg
--------------------
pub   rsa2048 2010-10-19 [SCA] [expired: 2020-10-16]
      E298 A3A8 25C0 D65D FD57 CBB6 5171 6619 E084 DAB9
uid           [ expired] Michael Rutter <marutter@gmail.com>

$ sudo apt-key del "E298 A3A8 25C0 D65D FD57 CBB6 5171 6619 E084 DAB9"
# expire된 key를 삭제
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
# key를 다시 추가
$ sudo apt-key list
# key추가된 것 확인.
pub   rsa2048 2010-10-19 [SCA] [expires: 2027-09-30]
      E298 A3A8 25C0 D65D FD57  CBB6 5171 6619 E084 DAB9
uid           [ unknown] Michael Rutter <marutter@gmail.com>
sub   rsa2048 2010-10-19 [E] [expires: 2027-09-30]

우분투 설치과정 및 설정

우분투 설치

  1. 우분투 배포판 다운로드, USB부팅 디스크 제작
    1. 윈도우에서 해야함
  2. /는 OS booting 전용 영역 package들을 깔걸 생각해서 64G정도 잡음
  3. swap 영역은 윈도우의 cache에 해당 32G
  4. 나머지 partition은 /home으로 몰아줌(이럼 사용자 data는 따로 백업가능)
  5. 부팅 usb로 부팅할때부터 nouveau때문에 화면이 안보일 수 있다. 이럴 땐.
    1. bios setting 메세지가 뜬 직후 shift를 누르고 grub화면이 뜨는 걸 확인한다.
    2. grub에서 원하는 ubuntu boot option에서 e를 누른다. 그럼 grub setting 화면이 뜸.
    3. linux로 시작하는 line에 modprobe.blacklist=nouveau 를 추가한다.

Ubuntu에 tensorflow(GPU) 돌리기

  1. 기본적으로는 ubuntu에 tensorflow구동 이걸따라가고,
  2. terryum 블로그 도 참고 할것.
  3. 이건 위의 블로그를 참고할 것. (blacklist nouveau를 /etc/modprobe.d/blacklist.conf 에 추가할것. 안 그럼 nvidia driver가 안깔림.)
  4. secure boot option도 disabled해둠. 안그럼 driver installer가 kernel에 덮어쓸 수 없음. 텐서플로 공홈에서도 secure boot가 과정을 복잡하게 한다고 되어 있음.
  5. ubuntu server에서는 linux header를 깔아줘야 하는 듯.
sudo apt-get install linux-source
sudo apt-get install linux-headers-4.15.55-generic
  1. nvidia 공식 홈피에서 정식 그래픽 드라이버를 깔고,
  2. CUDA를 깔땐 driver, openGL전부 안깐다. cuda랑 샘플만 깔아줌.
  3. 텐서플로우 공식페이지 를 참고하여 anaconda를 python 2.7버젼과 python 3.5버젼 용으로 따로 깔고, conda 가상 환경을 각각 만들어줌.
  4. 마찬가지로 conda 가상 환경 안에서 알맞는 tensorflow version을 각각 Install. (pip version이 안맞는다는 error도 conda깔고 그안에서 이것저것 깔면 해결)
  • pycharm 실행을 conda 가상 환경 terminal 에서 해주면 됨
  • 현재 내 컴 환경은
server $ cd pycharm/bin
server $ bash pycharm.sh
  1. 참고한 블로그
  2. Pycharm 을 사용하는 동안 terminal을 닫으면 안됨.

CUDNN libray command line에서 깔기

  • 아마 home directory ~/cuda에 CUDNN이 생성되어 있을것이다. 이것을 현재 CUDA version에 덮어 준다.
  • 주의, 현재 CUDA version을 symbolic link로 가서 확인하라.
  • 아예 적합한 버젼의 CUDA directory로 지정해주는게 나음.
sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

CUDA 여러version 쓰기

anaconda environment 명령어 활용

  • anaconda의 경우 environment를 (de)activation시킬 때마다 script를 자동으로 가동시킬 수 있다.
  • conda env name안에 아래와 같은 directory를 만들어주면 됨.
  • 참고블로그
  • 정식conda홈피
  • miniconda는 path가 다르므로 주의할 것.
cd $CONDA_PREFIX
mkdir -p ./etc/conda/activate.d
mkdir -p ./etc/conda/deactivate.d
touch ./etc/conda/activate.d/env_vars.sh
touch ./etc/conda/deactivate.d/env_vars.sh
  • activate.d안의 sh파일에는 다음과 같이, cuda 9.0을 load하고 싶을 경우
ORIGINAL_LD_LIBRARY_PATH=$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64
  • cuda 10.0부터는 CUPTI도 load 해주자.
ORIGINAL_LD_LIBRARY_PATH=$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:/usr/local/cuda-10.0/extras/CUPTI/lib64
  • deactivate.d안의 sh파일 에는 원래 symbolic link로 돌려주는
export LD_LIBRARY_PATH=$ORIGINAL_LD_LIBRARY_PATH
unset ORIGINAL_LD_LIBRARY_PATH

아래와 같은 해결책은 옛날 방식

  • CUDA 9.0을 깔고, python3.5, tensorflow1.5 환경을 구축했다.
  • 하지만 python2.7, tensorflow1.0을 유지하려면 CUDA8.0을 써야함.
  • 참고로 CUDA toolkit 만 깔땐 lighdm stop필요없음. nvidia driver 깔때 필요함.
  • nvidia driver 깔때 X server option에서 yes. no를 하면 무한 로그인현상 발생.

CUDA 여러 version을 쓰기위해선 symbolic link를 바꿀 필요가 있다. 다음과 같이 바꾼다.

sudo rm /usr/local/cuda # 기존 symbolic link 삭제
sudo ln -sT /usr/local/cuda-8.0 /usr/local/cuda # 새로운 symbolic link 형성

우분투, 윈도우10 멀티부팅

  • 내 경우에는 우분투 18.04가 있는 상태에서 윈도우10을 추가 파티션에 인스톨했다.
  • 그 결과 윈도우 부트 매니저가 활성화되어 원도우로 자동 부팅되었는데, grub option을 살리고 싶었다.
  • 만약 윈도우가 깔려있는 상태에서 우분투를 깔면 grub option booting이 자동 설정된다.
  • 이런 저런 삽질을 하다, 결국 이 싸이트에 나와있는 방법으로 해결했다.
  • Live ubuntu가 되는 bootable usb를 준비하고, UEFI모드로 부팅.
  • 그 다음에는 boot-repair 를 깔아서 repair 시켜주면, grub이 전반적으로 재설정되면서 윈도우 부팅 옵션도 추가된다.

서버로서 설정

ubuntu file sharing with OSX

root 계정으로 들어가서 samba를 깔아준다.

sudo apt-get install libcups2 samba samba-common

samba setting file을 열어서 user 계정을 팔수있게 한다.

gedit /etc/samba/smb.conf  
# editor에서
security = user
username map = /etc/samba/smbusers  # 적당히 추가
service smbd restart 
#cmd line에서 
samba restart

그런 다음 samba user를 추가해준다

smbpasswd -a <username>
service smbd restart

이제 OSX에서 smb 주소 접근가능. sharing folder를 탐색기해서 정해줘도됨

새로온 우분투 서버관련

python3 path가 잘못잡혀있었다. root 계정과 miruware 계정이 다른 python path를 잡고 있었음.

$ vim ~/.bashrc
export PATH = "/usr/local/lib/python2.7/dist-packages$PATH"
export PATH = "/usr/local/lib/python3.4/dist-packages$PATH"

리부팅 후 network setting이 안 잡히면 ifconfig로 확인 후 eth0이나 eth1이 있는지 확인. 없으면

sudo ifconfig eth0 up
sudo dhclient eth0

우분투 swap잡기

새로운 서버에 swap없었음.

$ sudo swapon -s # checking swap
Filename    Type  Size  Used  Priority

없다면, 생성해주자.

$ sudo fallocate -l 32GB /swapfile
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ sudo swapon -s # checking swap
Filename    Type  Size  Used  Priority
/swapfile  file  31249996 0    -1

부팅시에도 잡아줘야하므로

$ sudo vi /etc/sftab
/swapfile   none swap   0    0  # in editor
$ sudo vi /etc/sysctl.conf
vm.swappiness = 10 # in editor
$ sudo sysctl -p

Ubuntu ssh server setting

맥과 우분투 모두 ssh는 기본으로 인스톨 되어있다.

가장 간단하게 서버에 접속하는 방법은 클라이언트에서 다음과 같이 입력하는 거다.

ssh username@hostip

나는 서버의 내 계정과 서버 ip를 바로 사용했지만 서버에서 사용자 list를 관리할 수 있다.

RSA key 만들고 쓰기

client $ ssh-keygen -t rsa

rsa 키를 만들어주면.

  • ~/.ssh/id_rsa : private key
  • ~/.ssh/id_rsa.pub : public key

가 만들어진다. (내 맥북에는 이미 있음)

이중 public key를 서버로 카피해야함.

client $ ssh-copy-id -p "port_number" your_id@server_ip

로 하거나

client $ scp .ssh/id_rsa.pub your_id@server_ip:~/id_rsa.pub
server $ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

로 authorized_keys에 추가해야한다.

클라이언트 키에 pass phrase을 입력했을 경우

ssh server에 접속할때마다 rsa key pass phrase를 입력하는 게 귀찮다면

client $ ssh-add
input : passphrase

해두면 안 묻더라.

ssh server remote setting

외부에서도 서버에 접속하기 위해서는 공유기 port forwarding을 쓰면 된다.

공유기 setting에서 서버 ip를 잡고, port를 외부, 내부 모두 22(ssh)로 잡아줌. (대학 전산망이 port 22는 filtering해서 안됨.)

closed port 중에 숫자가 큰걸 외부 port로 잡았음(port ????)

이러면 공유기 ip로 접속된 ssh가 공유기 하의 서버 ip로 넘어감.

ssh -p ???? your_id@server_ip

로 간단하게 외부망에서도 접근할 수 있음.(테스트 통과)

Remote setting하면 보안에 신경써야함

sshd config file

etc/ssh/sshd_config에 다음과 같은 세팅을 제대로 해두자.

Protocol 2 # Protocol 1은 보안이슈가 있다. 보통 기본임.
AllowUsers root vivek jerry #특정 유저만 허용, DenyUsers를 써서 ban하는 방법도.
ClientAliveInterval 30 # 30sec까지만 허용.
ClientAliveCountMax 5 # 위를 5번 반복 (150sec허용) 
IgnoreRhosts yes #기본으로 되어있음.
HostbasedAuthentication no #기본으로 되어있음.
Banner /etc/issue.net #접속시 경고 배너 띄우기. 난 안 쓴다.
PermitEmptyPasswords no #기본으로 되어있음.
LogLevel INFO #기본으로 되어있음.
PasswordAuthentication no #RSA key를 쓰면 이건 꺼두자.

ssh setting을 바꿔 준 다음에는 ssh server restart해야함

systemctl restart sshd # ubuntu 16.
sudo service ssh restart # ubuntu 14. 18. 

ssh server log 시도 파일 보기

그중에서 실패한 시도들만 따로 보는 방법

server $ tail /var/log/auth.log -n 100 | grep 'Failed'

ssh session 유지하기

$ vi /etc/profile
$ vi ~/.bashrc
# 위 파일을 열어서 다음과 같은 구문을 추가한다.
export TMOUT=0

개인화 설정

ubuntu mouse point speed control

xset q | grep -A 1 Pointer # 현재 mouse pointer 가속도 값과 역치값이 나옴.
xset m 8 8 # 가속값을 8, 역치는 8픽셀로 설정

이것을 우분투 시작할 때 실행하기 위해서는 rc.local에 명령을 해줘야함

sudo vim /etc/rc.local

다음과 같이 추가함

xset m 8 2

가속값을 8, 역치는 2픽셀로.

ubuntu mouse scroll setting

xinput list

하면 mouse 이름이 뜸.

device=$(xinput list --id-only 'Logitech USB-PS/2 Optical Mouse')
xinput list-props $device

하면 mouse setting 들이 나오는데, 내 경우는

Evdev Scrolling Distance (284): -1, 1, 1

항목이 있음. 제일 앞의 수가 1이면 윈도우 스타일, -1이면 MAC 스타일

xinput set-prop $device "Evdev Scrolling Distance" -1, 1, 1

이 setting을 고정하려면 ~/.bashrc 파일에 device= 항목과 set-prop항목을 추가하자.

ubuntu control alt key 바꾸기

맥과 우분투를 번갈아 쓰다보면, control key 위치가 자주 헷갈린다. 맥의 command가 더 안쪽에 있기 때문

이를 해결하기 위해 control, alt key mapping

~$ code ~/.Xmodmap

.Xmodmap파일를 home에 만들어준다.

clear control
clear mod1
keycode 37 = Alt_L Meta_L
keycode 64 = Control_L
add control = Control_L Control_R
add mod1 = Alt_L Meta_L

가끔 keycode가 다를수 있다. 이를 위해서

~$ xev

를 실행하면 작은 하얀창이 뜨고 이 창에서 control key를 누르면 터미널에서

KeyPress event, serial 37, synthetic NO, window 0x4c00001,
    root 0x1f7, subw 0x0, time 953652796, (120,149), root:(1945,253),
    state 0x0, keycode 37 (keysym 0xffe3, Control_L), same_screen YES,
    XLookupString gives 0 bytes:XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

라고 뜸. 여기서 keycode확인하고 바꿔준다. 자꾸 원래대로 바뀌는데, 그 이유는 .bashrc가 터미널 열때마다 실행되면서 keymap을 초기화하기 때문인듯. 하여 .bashrc에 추가해줌

code ~/.bashrc

로 열고

xmodmap ~/.Xmodmap

을 추가함. 이래도 자꾸 원상복구됨…keymap를 리셋하는 프로그램이 있나봄. 이건 그냥 포기함..

ubuntu pycharm 설치

sudo sh -c 'echo "deb <http://archive.getdeb.net/ubuntu> $(lsb_release -sc)-getdeb apps" >> /etc/apt/sources.list.d/getdeb.list'
wget -q -O - <http://archive.getdeb.net/getdeb-archive.key> | sudo apt-key add -
sudo apt update
sudo apt install pycharm

How to write a great research paper by Simon PJ

Microsoft research Simon PJ의 강연 요약

  1. 먼저 쓰기 시작해라.
    1. 쓰다보면 아이디어가 발전한다. 연구를 진행하고 나서의 결과물이 논문이 아니다.
    2. 논문을 쓰는 과정 자체가 연구다. 쓰다보면 부족한 부분, 개선해야할 점이 보이고, 그러면서 연구를 진행하자.
  2. 키 아이디어를 잡자.
    1. 논문을 쓰는 목적은 아이디어를 전달하는 것이다. 아이디어는 프로그램 같은 것보다 생명력이 길다. 모짜르트의 악보를 생각해봐라. 실현한 연주는 오래가지 않지만, 악보에 담긴 악상은 지금도 유효하다. 그리고 그것을 써서 퍼트리지 않으면 무의미하다.
    2. 좋은 아이디어가 떠오르길 기다리지 마라. 다른 논문의 좋은 아이디어에 압도되어 기죽지 마라. 쓰다보면 발전한다. 그리고 쓰는 과정이 일종의 생각과 생각을 주고 받는 대화와 비슷하다.
    3. 그리고 아이디어는 하나의 clear, sharp ping이어야 한다. 논문을 읽고나서 남는 하나의 키 아이디어가 있어야 하고, 그것 하나를 하나의 논문을 통해 전달해야 한다.
  3. 이야기로 전달해라.
    1. 화이트 보드 앞에서 설명한다고 생각해봐라. 그 순서로 논문을 쓰자.
  4. 너의 공헌을 앞부분에 두어라.
    1. 문제를 먼저 기술하고, 이것에 대해 어떤 공헌을 했는지 서론의 초반에 가능하면 써라. 논문의 첫 페이지에 초록과 같이 보이도록 하면 좋다.
    2. 문제는 가능하면 구체적이고, 논문 안에서 해결되는 작은 덩어리면 좋다. 크고 모호한 문제(에베레스트)를 기술하는 것은 의미 없다. 어떤 버그에 대해 얘기하고 싶다면, 버그의 역사에 대해 얘기할 필요 없을 것이다.
    3. 너의 공헌이 무엇인지 분명하고 구체적으로 밝혀라.
    4. 서론에서 문제-공헌의 조합을 썼다면 나머지 부분에서 그것을 뒷받침하는 구체적인 증거를 제시하는 것이다.
    5. 증거들이 어디서 어떤식으로 쓰여져 있는지 스토리텔링으로 서론의 마지막을 쓰자. 플롯과 단순 시간순 서사의 차이를 생각해보라. 단순히 순서대로 쓰면 아무도 안 본다.
  5. 관련 논문은 나중에 쓰자.
    1. 내 아이디어에 대한 얘기가 독자들이 궁금해 할 내용이다. 관련 논문- 특히 문제를 해결하려고 시도한 역사를 언급하는 것은 지나치게 돌아 가는 길이 된다.
    2. 그리고 관련 논문을 길게 쓰는 것은 독자를 지치게 하고, 독자 스스로를 멍청하게 느끼게 한다.
    3. 또한 관련 논문을 까내리는 것은 피하자. 영감을 준 논문에 대해서는 관대하게 그러했던 점을 언급해라. 존경과 사랑은 나눌수록 커진다. 그렇게 쓴다고 해서 너의 공헌이 작아지는 것이 아니다.
    4. 너의 아이디어의 약점에 대해서도 밝히는 것이 좋다. disarming하는 것이 좋다.
  6. 독자를 먼저 생각하면서 써라.
    1. 독자가 이해하기 쉽도록 문제를 풀어서 쓰고, 가능하면 예제를 제시하자.
    2. 절대 니가 문제를 해결한 삽질한 과정으로 논문을 쓰지 마라. 상대방이 이해할 수 있는 방식으로 써야 한다.
  7. 독자의 말을 들어라.
    1. 전문가 독자도 좋지만, 비전문가 독자의 도움을 받는 것도 좋다.
    2. 모든 독자는 단 한번만 너의 글을 처음으로 읽을 수 있다. 이 기회를 놓치지 마라.
    3. 단순히 오탈자, 문법적 오류에 대한 피드백을 받는 것은 지양하자. 그런 피드백 보다는 어떤 부분에서 읽기가 막히는 지, 이해가 어려운지, 말이 안되는 것 같은 부분은 없는지를 받아야 한다. 그런 것을 원한다고 분명히 밝혀야 한다.
    4. 리뷰어에 대해서 고마운 입장을 가지자. 그 사람들은 너의 글에 대해 깊이 읽어주는 몇 안되는 사람이다. 그렇게 시간을 내는 것은 쉽지 않다. 아주아주 고마워하는 것이 좋다. 물론 쉽지는 않다.
    5. 리뷰어의 비평에 고마워하며 받아들이고, 리뷰어가 이해 못한 것 같다면 리뷰어를 멍청이 취급하는 것보다 다음과 같이 생각하는 것이 좋다. “이 멍청이도 이해할 수 있도록 논문을 다시 써야지”