Galaxy S8 | S8+ 삼성 2017.03.30 10:58



금일 공개된 S8 공식 영상 입니다.







Unboxing 영상도 추가 합니다.



'삼성' 카테고리의 다른 글

Galaxy S8 | S8+  (0) 2017.03.30
Real-time EXecutive(REX)  (0) 2011.02.09
갤럭시 그 두번째, 센느  (0) 2011.02.06

    서포트 벡터 머신 (Support Vector Machine, SVM)


서포트 벡터 머신은 Linear Classification, 즉 선형 분류 중 하나 입니다. 위의 그림과 같이 별모양과 동그라미가 있을 때 두 도형을 나누는 가장 좋은 boundary 를 찾아야 한다고 할 때 사용되는 머신 러닝 기법 중 하나 입니다. 그림 처럼 2차원일 경우 이 boundary 를 선으로 표현할 수 있지만 더 고차원으로 가게 될 경우 단순히 선형이라 표현하지 않고 hyperplane 이라 부르게 됩니다.


서포트 벡터 머신을 알기 위해서 중요한 기본 개념으로 3가지와 이에 따르는 몇가지 서브 개념들이 있습니다.

1. Margin ( VC Dimension, Shattering, Dichotomy )

2. Support Vector

3. Kernel

그럼 각각이 무엇인지 이론적으로 먼저 살펴보도록 하겠습니다. 


  • Margin - VC Dimension, Shattering, Dichotomy

안드로이드 개발자 분들이라면 margin 에 대해서 많이 보셨을 것 같습니다. 안드로이드를 하다보면 UI 를 그릴 때 각 View 간의 거리를 정할 때 margin 값을 주곤 합니다. 서포트 벡터 머신에서의 margin 도 사실상 동일한 개념 입니다. 위의 예제 그림에서 Class1 과 Class2 를 나누기 위한 선은 무수히 많이 그릴 수 있습니다. 그런데 어떤 선을 가장 잘 분류한 선이라고 표현할 수 있을 까요?

두 클래스 사이을 분류하는 무수히 많은 선, 고차원에서는 hyperplane, 중 margin 을 가장 크게 하는 hyperplane 을 찾는 것이 서포트 벡터 머신 분류를 잘 표현한 것이라고 할 수 있습니다.  

사실 직관적으로 생각해 보면 당연히 분류되는 아이템들 과의 margin 이 가장 큰 hyperplane 을 찾는 것이 가장 잘 분류하는 방법일 것 같긴 합니다. 그런데 왜 그럴까요?

이를 증명하는 개념 중 하나가 VC Dimension 입니다. VC Dimension 은 데이터를 분류하는 SVM 분류기가 얼마나 복잡한 데이터를 분류할 수 있는지를 나타내는 속성 입니다. 

그럼 이제 VC Dimension 을 좀 더 설명하기 위해 Dichotomy 란 개념을 추가적으로 설명해 보겠습니다. Dichotomy 란 어떤 집합이 있다면 이 집합을 둘로 나눈 다는 것 입니다. 예를 들어 A, B, C 라는 점이 있다면 { A }, { B, C} 혹은 { A, B, C}, { } 등으로 총 8 종류로 나누는 것이 가능 할 것 입니다. 이처럼 8 종류로 나누는 것을 Dichotomy 라고 부릅니다. 

그럼 Shattering 은 무엇일까요? 

Shattering 은 SVM 분류기가 Dichotomy 를 모두 표현할 수 있느냐 입니다. 위의 그림 중 마지막 그림을 보시면 + 와 - 를 나누는 선 하나를 표현할 수 있는 방법은 없습니다. 해당 경우의 Dichotomy 는 표현할 수 없는 것 입니다.


결론적으로 VC Dimension, 즉 SVM 분류기가 얼마나 복잡한 데이터를 표현할 수 있느냐의 여부는 Shattering 할 수 있는 가장 많은 데이터의 갯수라고 보실 수 있을 것 같습니다. 


일반적으로 N 차원의 hyperplane 의 VC Dimension 은 N+1 이라고 합니다. 또한 VC Dimension 이 높으면 안 좋다고 합니다. 그리고 Margin 을 최대화 한다는 말의 동치는 VC Dimension 을 줄인다는 말과 동일하다고 합니다.


이상 이론적인 부분에서의 SVM 의 Margin 에 관련된 부분들을 살펴 보았습니다. 다음 글에서 그럼 어떻게 Maximum Margin 을 찾을 수 있을지에 대해서 살펴보도록 하겠습니다.


머신러닝에 대해 공부하다 보면 학습 데이터를 어떤 식으로 구할지 고민하게 됩니다. 인터넷에 이미 많은 데이터 저장소들이 있고 오픈된 데이터들이 많으나 첫 시작점으로 삼을 만한 아주 기초적이고 심플한 데이터를 찾기 오히려 어렵다고 느껴지기도 합니다.


이럴 땐 그냥 만드는 것도 좋은 방법이 될수 있습니다. :)


아래는 소득(income), 부동산(real_estate), 가족수(family) 에 따라 슈퍼리치 인지 그냥 부자인지 중산층인지 가난한 사람인지 판별하기 위한 1000개 짜리 학습 데이터를 만들기 위한 코드 입니다.


값의 신뢰성을 위해 random 값의 범위와 최소 기본 값을 더해주어 각 타입별, 컬럼별 값을 생성하고 이를 종합하여 파일에 써주는 간단한 형태입니다. 간단한 형태의 데이터가 필요한 분들이 사용하시면 좋을 것 같습니다.



2017/03/09 - [CS/ML] - ML101 : 나이브 베이즈 (Naive Bayes) : 베이즈 정리



이전 글에서 알아본 베이즈 정리에 이어, 나이브 베이즈 분류에 대해서 알아보도록 하겠습니다. 아래 그림은 필기체 숫자를 인식하는 나이브 베이즈 분류기의 예제 입니다. 8 x 8 의 행렬이 있고, 해당 행렬에는 총 64개의 feature 값들이 있습니다. 각 feature 의 색이 칠해져 있는 상태에 따라서 숫자를 판별합니다.



예를들어, 3 이라는 숫자의 경우 3행 1열에 색이 칠해져 있을 확률이 매우 낮을 것입니다. 반면에 5행 5열에 색이 칠해져 있다면 3일 숫자의 확률은 매우 높을 것 입니다. 이러한 조건에 대한 확률을 표현한 표를 Conditional Probability Table 이라 하며 위 그림의 오른쪽 표들 입니다. 그리고 각 클래스별 확률을 나타낸 테이블을 Priority Table 혹은 Class Table 이라 부르며 P(Y) 로 정의된 왼쪽 표 입니다. 


P(F3, 1 = on | Y) 는 1 ~ 0 까지 가질 수 있는 결과 값의 Class 들일 경우에 색이 칠해져 있을 확률 입니다. 다시 말해 숫자 3일 경우 F3, 1 에 색이 칠해져 있을 확률은 0.05, 숫자 6일 경우 0.9 라고 할 수 있습니다.


그렇다면 8 x 8 의 숫자가 그려져 있는 어떤 그림이 주어졌을 때 해당 그림의 숫자가 무엇인지 어떻게 판별할 수 있을까요? 지난 글에서 다루었던 베이즈 정리를 바탕으로 이 문제를 풀어보도록 하겠습니다. F0,0 ~ F15,15 총 64개의 CPT 가 주어졌을 때 Class 들의 확률을 구하는 식은 아래와 같습니다.



주어진 Class table 과 CPT 들의 곱을 이용하여 입력으로 들어오는 그림의 상태에 따라 어떠한 숫자인지 값을 구할 수 있고 가장 확률이 높은 Class 값에 맞게 해당 숫자를 예측할 수 있습니다. 


본래의 식은 분모로 P(F) 를 가지는 것이 맞으나 위 문제의 경우  모든 클래스에 대해서 동일한 분모를 가지기 때문에 어떤 클래스 값이 가장 높은지 비율만 구하는 문제에서는 분자의 크기만 아는 것으로 충분하기에 이를 생략할 수 있습니다.



※ 라플라스 스무딩 (Laplace Smoothing)

위의 방법의 경우 인풋 값이 우리가 생각하는 일반적인 모양의 숫자가 들어왔다고 했을 때는 잘 동작할 수 있지만 학습 데이터에 없던 값이 들어오거나 이상 값이 들어올 경우 확률이 0이 되는 값이 나와 정상적으로 분류가 안되는 경우가 있습니다.


이럴 경우 값의 보정을 위해 사용되는 기법이 라플라스 스무딩 기법 입니다. 라플라스 스무딩은 실제로 관찰한 것보다 한번씩 더 봤다고 가정 하는 것 입니다. 즉 확률이 0일 경우를 제외시키는 방법으로 일반적으로 아래의 식과 같이 표현 합니다.





  • Bayes rule

일반인이 암 환자를 진단하는 신규 검사법을 사용하여 검사해본 결과가 양성 반응일 때, 실제로 암에 걸렸을 확률을 구하는 문제가 있다고 해보겠습니다. 이 문제를 풀기 위해 주어진 조건과 조건부 확률을 다음과 같다고 가정하겠습니다.


Y -> 실제 병에 걸렸을 경우 { 1 : true, 0 : false }


X -> 검사 결과 경우 { 1 : 양성, 0 : 음성 }


P ( X = 1 | Y = 1 ) = 0.8 검사의 정확도로 실제 병에 걸렸을 경우, 검사 결과도  양성일 확률

즉, 본 검사는 80% 의 확률로 정확한 진단을 내리고 20% 확률로 실제 병이 걸린 환자에 대해 음성이라는 오진을 내리게 됩니다.


P ( X = 1 | Y = 0) = 0.1 일명 False positive 로 병이 없는데도 불구하고 검사 결과가 양성으로 나올 확률.


P ( Y = 1) = 0.004 일반적으로 암에 걸릴 확률.  



조건을 확인하고 문제를 다시 읽어보도록 하겠습니다. 위와 같은 조건이 주어 졌을 때 암 검진 결과가 양성 일 경우, ( X = 1) 실제로 암에 걸렸을 확률 ( Y = 1) 이므로 우리가 구해야할 문제는 아래와 같습니다.



이 문제는 베이즈 정리를 이용해 풀 수 있습니다. 베이즈 정리의 기본 공식은 다음과 같습니다.



공식으로 확인해 봐도 알겠지만 베이즈 정리는 본래 역확률 (inverse problem) 을 해결하기 위해 사용되는 방법 입니다. P(B|A) 라는 조건부 확률을 알고 있을 때 P(A|B) 를 구하는 방법인 것 입니다. 하지만 공식처럼 단순히 역확률 문제에만 사용되는 것이 아니라 이전 경험을 바탕으로 확률을 추론하는데 사용할 수 있는 방법 이기도 합니다. 주어진 자료를 이용해 새로운 사실의 확률을 구하는 방법, 다시 말해 머신러닝에 사용되기 매우 좋은 방법 입니다. 


앞의 문제는 암 검진 결과가 양성일 때 실제 암에 걸렸을 확률을 구하라는 것이었습니다. 주어진 조건을 공식에 맞추어 문제를 풀어도록 하겠습니다.



머신 러닝의 관점에서 베이즈 정리를 다룰 때 몇가지 알아야할 용어도 있습니다. 위 조건에서 P(Y) 는 암에 걸릴 확률 입니다. 어떠한 자료도 없을 때 특정 사건이 일어날 확률에 대한 가정으로 사전 확률(Prior Probability) 이란 용어가 있습니다. 그리고 가능도(likelihood) 라는 용어도 있습니다. 사건이 일어났다는 가정 하에서 새로이 가지게 된 자료가 관측될 확률을 의미 합니다. 베이즈 정리의 분모는 가능도를 구할때 조건으로 걸린 사건의 확률입니다. 마지막으로 위 문제에서 답에 해당 하는 부분, 사전확률과 가능도를 이용해 구한 답을 사후 확률(posterior probability) 라고 합니다.


사실 위의 문제의 경우 사건의 종류가 단 2개 뿐인 매우 간단한 문제 였습니다. 일반적인 문제나 실제 머신 러닝 적용을 위한 문제에서는 사건의 경우는 2개 이상을 것 입니다. n개의 사건을 가지는 일반적인 베이즈 정리는 다음과 같습니다.


표본 공간 는 서로소인 의 합집합이며

는 위에서 정의된 사건 일때



아래의 그림과 함께 공식을 보시면 더 이해하기 쉬우실 것 같습니다. P(A1|B) 를 구하고 싶다면 조건부 확률의 공식에 따라 분자는 P(A1∩B) 를, 분모는 P(B) 를 가지게 됩니다. 곱셈정리에 따라 분자와 분모는 각각 위의 공식과 같이 변환 되는 것 입니다.

 





안드로이드 파티션


 데스크탑에서는 1 ~ 2 개의 파티션만 사용하지만 모바일 디바이스에서는 여러 개의 파티션을 사용합니다. 시스템 복구나 부팅을 보장하기 위해서 입니다. 모바일 기기의 특성 상 자주 수리도 해야하고, 팩토리 리셋을 해도 지워지지 않는 영역이 있어야 하고, 복구를 위한 영역이나 부팅을 위한 파일을 따로 보관해야 하는 등의 영역이 필요하기에 파티션을 많이 나누었다고 합니다.


안드로이드의 디바이스 파티션의 종류에 대해서 살펴보면 크게 '표준 안드로이드 파티션' '칩셋 특화 파티션' '벤더 특화 파티션' 을 들 수 있습니다. 각각의 파티션에 대한 설명은 제목으로 대체 할 수 있을 것 같습니다. 표준 안드로이드 파티션은 말 그대로 표준으로 사용되는 파티션이며, 칩셋, 벤더 특화 파티션은 퀄컴, S.LSI 와 같은 칩셋에 특화된 파티션을 의미 합니다. 그리고 벤더 특화 파티션은 삼성이나 LG, HTC 와 같이 각 벤더에 따라 다른 파티션이 있을 수 있겠습니다.



[표준 안드로이드 파티션]

 영역 이름명

포맷

설명

boot

bootimg

 커널 + initramfs(램디스크), 부팅을 위한 커널 및 램디스크가 있는 공간

cache

Ext4

 안드로이드 /cache, 업데이트 및 복구에 사용

recovery

bootimg

 부트-복구 : 시스템 복구를 위한 커널 + 다른 initramfs

system

Ext4

 안드로이드 /system, OS 바이너리와 프레임워크

userdata

Ext4 / F2Fs

 안드로이드 /data, 사용자 데이터와 설정

어떤 파티션이 현재 마운트 되어 있는지 확인하고자 한다면 df / mount 명령어를 통해 살펴 볼 수 있습니다.

 


파일 시스템

안드로이드 루트 파일시스템에 보면 다양한 디렉토리 들이 있습니다. (adb shell 로 디바이스에 진입하였을 때 보이는 리스트) 아래의 표를 통해 주요 디렉토리에 대한 설명을 하고자 합니다.

default.prop추가 system property 파일로, init 을 통해 얻어져 시스템 속성으로 적재 됩니다. 기본적으로 읽기 전용 입니다.
file_contextsSE-Linux 를 위한 파일 컨텍스트 입니다. 시스템 파일과 디렉터리 접근 속성을 제한 합니다.
fstab.hardware파일시스템 마운트 테이블 입니다
initPID 1번으로 시스템 시작 시에 커널에서 실행하는 바이너리 입니다.
init[...].rc

init 을 위한 설정 파일 입니다. 메인은 init.rc 이고 옵션명에 따라 추가 설정 파일이 있습니다.

property_contextsSE-Linux 를 위한 프로퍼티로 시스템 속성에 대한 접근을 제한 합니다.
seapp_contextsSE-Linux 앱 컨텍스트로 앱 동작 범위를 제한 합니다.
sepolicySE-Linux 정책 입니다.
sbin/시스템 핵심 바이너리들이 포함된 디렉터리로 벤더 특화 바이너리들도 함께 포함될 수 있습니다.

 

그 외 주요 디렉토리에 대해 좀 더 자세히 알아보도록 하겠습니다.



/system

이곳은 모든 안드로이드 컴포넌트의 홈입니다. root:root 소유의 755(rwxr-xr-x) 권한을 가진 곳 입니다. 하지만 일단 마운트 되게 되면 읽기 전용으로 마운트 되게 되어 있습니다.

어찌보면 당연한 것이겠지만 이곳을 잘못 변경하면 단말이 벽돌이 될수도 있습니다. 이곳에 벤더 특화 컴포넌트도 함께 포함되어 있습니다.


또한 시스템 앱들이 있는 /priv-app 도 이곳에 포함되어 있습니다. /app 과 /priv-app 의 차이라면 /app 내에는 시스템 어플리케이션이 들어가며 /priv-app 에는 프리빌리지드 앱이 들어가게 되어 있습니다. Google 앱의 경우 /app 내에 들어가게 되어 있습니다.

/priv-app 과 /app 영역의 차이는 아래의 글을 참조 하시면 좋을 것 같습니다.

다시 말해 signatureOrSystem 퍼미션을 가지기 위해서는 /priv-app 디렉토리 내의 apk 만 가능하며 /app 은 가능하지 않습니다.

 

Some system apps are more system than others "signatureOrSystem" permissions are no longer available to all apps residing en the /system partition.

Instead, there is a new /system/priv-app directory, and only apps whose APKs are in that directory are allowed to use signatureOrSystem permissions without sharing the platform cert. This will reduce the surface area for possible exploits of system- bundled applications to try to gain access to permission-guarded operations.

The ApplicationInfo.FLAG_SYSTEM flag continues to mean what it is says in the documentation: it indicates that the application apk was bundled on the /system partition. A new hidden flag FLAG_PRIVILEGED has been introduced that reflects the actual right to access these permissions.

 

이곳에 있는 파일 중 build.prop 이 저희가 알고 있는 SystemProperties 가 정의 된 곳 입니다. cat 으로 까보면 단말의 정의된 속성들을 확인 할 수 있습니다.

(물론 adb shell getprop > ,, 을 통해 확인 할수도 있습니다.)



/system/bin, /system/xbin

system 내에 사용되는 바이너리, 스크립트 등이 포함되어 있는 디렉토리 입니다. 예를 들어 해당 경로 내에 bootanimation 을 직접 실행할 경우 단말의 부트 애니메이션이 실행 됩니다.

dex 를 ART 로 변경해 주는 dex2oat 와 같은 도구 이 경로 내에 포함되어 있으며 dumpsys, logcat, am, pm, sm, wm 흔히 adb 명령어를 수행할 할때 쓰는 각각의 명령어 바이너리가 바로 이 곳에 저장되어 있습니다.

'모바일' 카테고리의 다른 글

Android 개발 : 파일 파티션 및 파일 시스템 (1)  (0) 2017.03.06
Android 소식 : Instant app 테스트  (0) 2017.01.30
모토로라-아트릭스  (0) 2011.02.09