Monday, December 29, 2008

Programming skill...

Programming skill...
  • Those that has it, talks about why there are people who just can't program (no matter what).
  • Those that don't have it, talks about why the world isn't fair.
Why do I say this? Because if I see another article/blog that says some people just can't program no matter what, I need to pull his head off.

Disclaimer: In no way did I claim I'm superior in programming skills.

Sunday, June 08, 2008

Why good is actually bad.

Basic notion has it that as we gain more experience, our peers or children gets to reap the benefits. Well, the problem is, that is where the problem lies. You see, human learns by experience, be it good or bad. When we made a mistake, some external signals, be it your teacher or your mum tells you not to do it again (Bad experience). When we did something right, you are rewarded or praised (Good experience). Call it reinforcement learning, call it supervised learning, the point is, if you did something wrong, if the signs that you did something wrong was hidden from you, you are learning to repeat your wrongdoing. You may not implied that, or want to, but believe it or not, you are (asking him to repeat the wrong doing). There is no such thing as, "You are doing it wrong, but I'll just let you go this time.". It makes absolutely no sense. If you look at this way, this is common sense. We may not like being scold or make mistakes, it's all aweful medicine, but sometimes the patient just needed it.

The scary thing is, that’s what we do every now and then. Let me tell of a fictional story to illustrate the problem. A software programmer discovered that with C++, it is difficult to write code that does not leak memory, he suggested the team to use Python instead, before the team has decide which language to use. All is good and well. Well, the problem is C++ is still prevalent. Many legacy systems are still written in C/C++. When one of the other programmers in the team was assigned to maintain legacy software written in C++, he might not perform. Why? He/She has never learned best practices of C++! And the sole reason of that is because he/she never gets to learn it anyway; every time the chances come one of the programmer in the team will recommend the team to use a more modern, safer language. So you see, the point is, if you are only told that it's a wrong way and you should not go there, you think that it has saves you whole lot of trouble, but the truly sad truth is, it does not mean that you have actually learn anything. You merely avoided the problem.

Now, some of you might argue that there is simply too much to learn, it is unfeasible to learn everything. While that is true, if that something to learn is something fundamental, it is a mistake not to go through the entire learning process. This is the case where shortcut is not a good idea. Like the famous saying goes, “If we do not learn from history, we are bound to repeat it”. And the only way to learn history is to be in history. Walk in their shoes. Doing what they are doing. Merely being told the mistakes of the past does nothing to prevent it from happening it again, since there may be new, unexplored alternative path that will ultimately lead to the same mistake. And the only way to prevent it from happening is to have greater understanding of the nature of the mistake, and learning how to prevent it from ever happening again.

Perhaps, this is why there has been talk that the quality of Computer Science graduates are dropping, due to the fact that Java was chosen as most CS first language, where as lower level languages like assembly and C/C++ should be taught first, because they not only taught the students about the language itself, but also the fundamentals of computer architecture itself, how things work in the low level and etc. You can read all about it in [Computer Science Education: Where Are the Software Engineers of Tomorrow?].

The truth is, it is extremely dangerous to say that all history is useless experience, though that is not to say that there is no such thing as useless experiences. If you studied machine learning, you will know that, a typical artificial neural network would become brain dead if it is only showed positive samples without any negative samples during the training phase. A human brain works almost in the same principle, since a human brain is really both a discriminative and a generative system. Throwing off the discriminative part of our brain and it is likely that we will never learn. Similarly, if a baby is only taught the right way of doing things, the baby will not have a clue of if what he is doing is right or wrong. In other words, his discriminative ability, his ability to discern what is right or wrong, what is good or bad is simply not there or severely random and thus flawed.

Even if there are times when we needed to choose which knowledge to gain, I shudder to think at the outcome of making the wrong judgement on which knowledge is useless, and which is not: Because depending on what the situation is, it's actually very hard for us to really know for sure. Like Steve Jobs said, it's impossible for us to connect to dots ahead of time. We can only do so, looking back.

This is all obvious and understandable. However, recently, it is increasingly becoming harder to made mistakes, as we are becoming more intolerant to mistakes, while technology is becoming more adept at hiding complexities that are deemed to cause human mistakes. In the office, you are not allowed to use tools that your project leader deemed is bad, you will be fired for making the wrong decisions; In the university, you can't opt for subjects that are deemed to be obsolete by some, you are forced to answer questions based on what is stated on the textbook instead of your own thinking, which ultimately affected our creativity as mentioned in this article; In the house, children are taught not to talk to strangers, just like what Bruce Scheneier in his article "The Kindness of Strangers". In almost every cases, one is simply not acceptable to be different from others, you have to be just like everyone else, even though everyone else could be wrong. We should be given guidance, yes, but more importantly, we should be given the chance to make mistakes! Not repeating the same mistakes should be everyone's responsibility. Not the enforcer. Ideally.

To summarize, discriminative capability is important for us to learn. It is extremely crucial that we are left to made mistakes so that we would not do it again. The experience of doing something wrong is much more important than the experience of doing something correctly. Now, if there is an alternative way for us to experience the whole crucial process of making mistakes without actually wasting any time for it and yet learn a good lesson out of it, I would really like to know about it.

Monday, May 05, 2008

End of examination. Begining of research life.

Today marks the last day of my examination in this 3 year UTAR life. And I feel like this is the worst examination of all, and the only paper that I have the confidence to get at least A- is AI. To me, doing good in examination just don't motivate me that much anymore, what motivates me more now is research and development in things related to applied AI and computer vision. Which although sounds hard, is actually a lot easier than you might think, because there is no fixed and established way of doing things. Therefore, it tends to tax your creativity more. It's a lot harder to study, understand and memorizes things that other genius scientist/engineer has established, which is what is expected of you in university. In world of research, you don't necessary have to do it using other scientists' ways. They could be wrong and there seems to be always room for improvement. Everyone is solving a small piece of the puzzle, and no one knows the complete solution.

However, before I officially begin my research life, I will take a detour to work in Panasonic R&D for 1 year or so, commencing on June, before coming back to UTAR to begin my Master degree course.

Friday, February 01, 2008

My AI mini project

UCEC3064 - Intelligent Technique for Engineering Applications

Proposed mini project title:
Improving Circular Pairwise Neural Network Performance on Multiclass Classification Problems

Traditionally, neural networks are trained in a monolithic fashion. That is, a neural network would be trained to classify all K classes, preferably given equivalent amount of training samples for each classes. Training is slow and is unable to take advantage of current multi-cores or multi-processor (SMP) systems to train different classes concurrently. The research done by Teo Choon Hui on circular pairwise classification is an attempt to remedy this by breaking down a K class problem into k binary circular pairwise classification sub-problems. However, this method will reduce recognition accuracy due to the fact that there is a lacked of direct competition between certain pairs of classes. But, at the same time, such a method reduces training time by almost a factor of 3. In this research, we will compare the results of a binary one-versus-all classifier and a pairwise classifier with a circular pairwise classifier as proposed by Teo Choon Hui and attempts to improve recognition accuracy by experimenting with selective circular pairwise classification, in which hard binary sub-problems are paired instead of randomly choosing any 2 classes. We will then attempts to introduce an N-th class into each binary classifier to become a ternary circular pairwise classifier and evaluate its performance.

One-versus-all, Binary classification, Pairwise, Single-winner election methods, Circular Pairwise

Saturday, January 12, 2008

PanaGeek final round experience

It was a rather unlucky day. I got up late, went almost lost searching for PRDCM office. But when I finally found their office, I can't help but noticed the nice view throughout. It's Cyber Jaya after all. When I step into the office (nice office by the way) itself, a bunch of people has already arrived.

When it was time to begin competition, we are given a short tour of the office. Looks good, I saw some huge 24" Dell LCD lying around. We were then proceed to the conference room where we have our round 1 assessment. This is where we are given a scenario and are asked to come out with some ideas for it. I believe I have given a OK idea, although it may not be exactly feasible right now because it involves something as elusive as AI (Actually to be frank, I do not think it's all that hard but somehow I don't think my ideas fare very well in the feasibility department). Due to my deep interests in AI (which happens to be my final year project topic), my idea somehow revolves around it and this competition sort of reflect that.

When it comes to the 2nd round, which is a group assignment, we were randomly group into 4 teams (with 5 in a group) and are assigned a mini project involving some basic socket programming, a typical client/server application. I can say that it's a very simple task if we know socket programming well. Unfortunately, none of us actually do, nothing beyond a last-minute read on socket programming tutorial, that is. The encryption/decryption part could be harder, due to the fact that you need to be able to convert your mathematical skills into programming codes. Which might not be easy if you do not have some background in AI (AI people tends to be good in implementing an algorithm after reading a whitepaper, something that I still have much to learn in this regard). On a side note though, I believe for one to be a good AI researcher, one needs to be an excellent programmer. But that's story for another day :).

At the end of all this, our team got the best team award (the prize was a hamper). And I was awarded a second runner-up, while the other of my team member got a first prize. Congrats Aik Keong! It's a real pleasure working with you. And don't forget my treat after getting your 5k ya, :D.